Commit Graph

4983 Commits

Author SHA1 Message Date
Alexandre Oliva 21edd84161 link pthread_join from std::thread ctor
Like pthread_create, pthread_join may fail to be statically linked in
absent strong uses, so add to user code strong references to both when
std::thread objects are created.


for  libstdc++-v3/ChangeLog

	PR libstdc++/104852
	PR libstdc++/95989
	PR libstdc++/52590
	* include/bits/std_thread.h (thread::_M_thread_deps): New
	static implicitly-inline member function.
	(std::thread template ctor): Pass it to _M_start_thread.
	* src/c++11/thread.cc (thread::_M_start_thread): Name depend
	parameter, force it live on entry.
2023-03-03 16:06:44 -03:00
Jonathan Wakely c54cae823f libstdc++: Fix typo in comment in bits/cow_string.h
libstdc++-v3/ChangeLog:

	* include/bits/cow_string.h: Fix typo in comment.
2023-03-01 21:26:08 +00:00
Jonathan Wakely 8e342c0455 libstdc++: Fix uses_allocator_construction_args for pair<T&&, U&&> [PR108952]
This implements LWG 3527 which fixes the handling of pair<T&&, U&&> in
std::uses_allocator_construction_args.

libstdc++-v3/ChangeLog:

	PR libstdc++/108952
	* include/bits/uses_allocator_args.h
	(uses_allocator_construction_args): Implement LWG 3527.
	* testsuite/20_util/pair/astuple/get-2.cc: New test.
	* testsuite/20_util/scoped_allocator/108952.cc: New test.
	* testsuite/20_util/uses_allocator/lwg3527.cc: New test.
2023-02-28 09:49:11 +00:00
Jonathan Wakely 822a11a1e6 libstdc++: Do not use memmove for 1-element ranges [PR108846]
This avoids overwriting tail padding when algorithms like std::copy are
used to write a single value through a pointer to a base subobject.

The pointer arithmetic on a Base* is valid for N==1, but the copy/move
operation needs to be done using assignment, not a memmove or memcpy of
sizeof(Base) bytes.

Instead of putting a check for N==1 in all of copy, copy_n, move etc.
this adds it to the __copy_move and __copy_move_backward partial
specializations used for trivially copyable types. When N==1 those
partial specializations dispatch to new static member functions of the
partial specializations for non-trivial types, so that a copy/move
assignment is done appropriately for the _IsMove constant.

libstdc++-v3/ChangeLog:

	PR libstdc++/108846
	* include/bits/stl_algobase.h (__copy_move<false, false, RA>)
	Add __assign_one static member function.
	(__copy_move<true, false, RA>): Likewise.
	(__copy_move<IsMove, true, RA>): Do not use memmove for a single
	value.
	(__copy_move_backward<IsMove, true, RA>): Likewise.
	* testsuite/25_algorithms/copy/108846.cc: New test.
	* testsuite/25_algorithms/copy_backward/108846.cc: New test.
	* testsuite/25_algorithms/copy_n/108846.cc: New test.
	* testsuite/25_algorithms/move/108846.cc: New test.
	* testsuite/25_algorithms/move_backward/108846.cc: New test.
2023-02-28 09:49:11 +00:00
Jonathan Wakely dfa85beebf libstdc++: Add Doxygen comment for string::resize_and_overwite
This is a complicated API that should be clearly documented.

Also improve the comment on basic_ios::_M_setstate.

libstdc++-v3/ChangeLog:

	* include/bits/basic_ios.h (basic_ios::_M_setstate): Add
	caveat to comment.
	* include/bits/basic_string.h (resize_and_overwrite): Add
	doxygen comment.
2023-02-27 13:42:21 +00:00
Jonathan Wakely 916ce577ad libstdc++: Implement P2255R2 dangling checks for std::pair
This uses the new __reference_constructs_from_temporary built-in to
identify when a std::pair constructor will bind a reference to a
temporary that goes out of scope at the end of the constructor.  For
example, std::pair<const long&, int> p(1, 2); will call the pair<const
long&, int>::pair(U1&&, U2&&) constructor with U1=int and U2=int. In the
constructor body a temporary long will be created and the p.first member
will bind to that temporary. When the constructor returns, the reference
is immediately dangling. P2255 requires the constructor to be deleted to
prevent this bug.

Although P2255 was approved for C++23, it fixes a longstanding LWG issue
in older standards, and it turns silent runtime undefined behaviour into
a compilation error. Because of that, the dangling checks are applied
all the way back to C++98.  However, if these changes cause too much
code to be rejected (e.g. in cases where the dangling reference is never
used after the constructor returns) then we can consider removing them
for C++20 and older standards.

The affected constructors are deleted for C++20 and later, when concepts
are available to simplify the constructor constraints. For C++17 and
earlier the overload sets are complicated and awkward to maintain, so
the dangling checks are done in static assertions in the constructor
bodies, instead of being SFINAE-friendly constraints. The pre-C++17
assertions are only enabled for Debug Mode, to avoid introducing a
breaking change in Stage 4. We should consider enabling them by default
in Stage 1 for GCC 14.

libstdc++-v3/ChangeLog:

	* include/bits/stl_pair.h (pair) [C++20]: Add non-dangling
	constraints to constructors and add deleted overloads for the
	dangling cases, as per P2255R2.
	(pair) [!C++20 && _GLIBCXX_DEBUG]: Add static assertions to
	make dangling cases ill-formed.
	* testsuite/20_util/pair/dangling_ref.cc: New test.
2023-02-16 14:38:38 +00:00
Jonathan Wakely dc79eba72b libstdc++: Fix uses of non-reserved names in headers
The non-reserved names 'val' and 'dest' were being used in our headers
but haven't been added to the 17_intro/names.cc test. That's because
they are used by <asm-generic/posix_types.h> and <netinet/tcp.h>
respecitvely on glibc-based systems.

libstdc++-v3/ChangeLog:

	* include/bits/fs_ops.h (create_directory): Use reserved name
	for parameter.
	* include/bits/ranges_algo.h (__contains_subrange_fn):
	Likewise.
	* include/bits/regex_automaton.h (_State_base::_M_print):
	Likewise.
	* include/bits/regex_automaton.tcc(_State_base::_M_print):
	Likewise.
	* include/bits/regex_scanner.tcc(_Scanner::_M_print): Likewise.
	* include/experimental/bits/fs_ops.h (create_directory):
	Likewise.
	* include/std/mutex (timed_mutex::_M_clocklock): Likewise.
	(recursive_timed_mutex:_M_clocklock): Likewise.
	* include/std/tuple (basic_common_reference): Likewise.
	* libsupc++/cxxabi_init_exception.h
	(__cxa_init_primary_exception): Likewise.
	* testsuite/17_intro/names.cc: Add checks.
2023-02-16 10:24:45 +00:00
Jonathan Wakely 0afcb71321 libstdc++: Fix non-reserved name for template parameter
libstdc++-v3/ChangeLog:

	* include/bits/ranges_algo.h (__find_last_fn): Rename T to _Tp.
	(__find_last_if_fn): Likewise.
2023-02-06 14:23:47 +00:00
Nathaniel Shead aa02a69e15 libstdc++: Implement P1413R3 'deprecate aligned_storage and aligned_union'
Adds deprecated attributes for C++23, and makes use of it for
std::aligned_storage, std::aligned_storage_t, std::aligned_union, and
std::aligned_union_t.

libstdc++-v3/ChangeLog:

	* doc/doxygen/user.cfg.in (PREDEFINED): Add new macros.
	* include/bits/c++config (_GLIBCXX23_DEPRECATED)
	(_GLIBCXX23_DEPRECATED_SUGGEST): New macros.
	* include/std/type_traits (aligned_storage, aligned_union)
	(aligned_storage_t, aligned_union_t): Deprecate for C++23.
	* testsuite/20_util/aligned_storage/deprecated-2b.cc: New test.
	* testsuite/20_util/aligned_union/deprecated-2b.cc: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-02-06 14:23:47 +00:00
Nathaniel Shead 4f49ae607c libstdc++: Normalise _GLIBCXX20_DEPRECATED macro
Updates _GLIBCXX20_DEPRECATED to be defined and behave the same as the
versions for other standards (e.g. _GLIBCXX17_DEPRECATED).

libstdc++-v3/ChangeLog:

	* doc/doxygen/user.cfg.in (PREDEFINED): Update macros.
	* include/bits/c++config (_GLIBCXX20_DEPRECATED): Make
	consistent with other 'deprecated' macros.
	* include/std/type_traits (is_pod, is_pod_v): Use
	_GLIBCXX20_DEPRECATED_SUGGEST instead.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-02-06 14:23:46 +00:00
François Dumont 540a22d243 libstdc++: Optimize basic_string move assignment
Since resolution of Issue 2593 [1] we can consider that equal allocators
before the propagate-on-move-assignment operations will still be equal
afterward.

So we can extend the optimization of transfering the storage of the move-to
instance to the move-from one that is currently limited to always equal
allocators.

[1] https://cplusplus.github.io/LWG/issue2593

libstdc++-v3/ChangeLog:

	* include/bits/basic_string.h (operator=(basic_string&&)): Transfer move-to
	storage to the move-from instance when allocators are equal.
	* testsuite/21_strings/basic_string/allocator/char/move_assign.cc (test04):
	New test case.
2023-02-04 14:03:54 +01:00
Patrick Palka c9aef107ce libstdc++: Implement ranges::find_last{,_if,_if_not} from P1223R5
libstdc++-v3/ChangeLog:

	* include/bits/ranges_algo.h (__find_last_fn, find_last):
	Define.
	(__find_last_if_fn, find_last_if): Define.
	(__find_last_if_not_fn, find_last_if_not): Define.
	* testsuite/25_algorithms/find_last/1.cc: New test.
	* testsuite/25_algorithms/find_last_if/1.cc: New test.
	* testsuite/25_algorithms/find_last_if_not/1.cc: New test.
2023-02-03 10:52:18 -05:00
Patrick Palka 28752bcbbf libstdc++: Implement ranges::iota from P2440R1
libstdc++-v3/ChangeLog:

	* include/bits/ranges_algo.h (out_value_result): Define.
	(iota_result): Define.
	(__iota_fn, iota): Define.
	* testsuite/25_algorithms/iota/1.cc: New test.
2023-02-03 10:52:15 -05:00
Patrick Palka 6716822c54 libstdc++: Implement ranges::contains/contains_subrange from P2302R4
libstdc++-v3/ChangeLog:

	* include/bits/ranges_algo.h (__contains_fn, contains): Define.
	(__contains_subrange_fn, contains_subrange): Define.
	* testsuite/25_algorithms/contains/1.cc: New test.
	* testsuite/25_algorithms/contains_subrange/1.cc: New test.
2023-02-03 10:52:13 -05:00
Jonathan Wakely db8d6fc572 libstdc++: Fix std::filesystem errors with -fkeep-inline-functions [PR108636]
With -fkeep-inline-functions there are linker errors when including
<filesystem>. This happens because there are some filesystem::path
constructors defined inline which call non-exported functions defined in
the library. That's usually not a problem, because those constructors
are only called by code that's also inside the library. But when the
header is compiled with -fkeep-inline-functions those inline functions
are emitted even though they aren't called. That then creates an
undefined reference to the other library internsl. The fix is to just
move the private constructors into the library where they are called.
That way they are never even seen by users, and so not compiled even if
-fkeep-inline-functions is used.

On trunk there is a second problem, which is that the new equality
operators for comparing directory iterators with default_sentinel use
the shared_ptr::operator bool() conversion operator. The shared_ptr
specializations used by directory iterators are explicitly instantiated
in the library, but the bool conversion operators are not exported. This
causes linker errors at -O0 or with -fkeep-inline-functions. That just
requires the conversion operators to be exported.

libstdc++-v3/ChangeLog:

	PR libstdc++/108636
	* config/abi/pre/gnu.ver (GLIBCXX_3.4.31): Export shared_ptr
	conversion operators for directory iterator comparisons with
	std::default_sentinel_t.
	* include/bits/fs_path.h (path::path(string_view, _Type))
	(path::_Cmpt::_Cmpt(string_view, _Type, size_t)): Move inline
	definitions to ...
	* src/c++17/fs_path.cc: ... here.
	* testsuite/27_io/filesystem/path/108636.cc: New test.
2023-02-02 16:18:37 +00:00
Jonathan Wakely 3376467ce0 libstdc++: Add returns_nonnull to non-inline std::map detail [PR108554]
std::map uses a non-inline function to rebalance its tree and the
compiler can't see that it always returns a valid pointer (assuming
valid inputs, which is a precondition anyway). This can result in
-Wnull-derefernce warnings for valid code, because the compiler thinks
there is a path where the function returns null.

Adding the returns_nonnull attribute tells the compiler that is can't
happen. While we're doing that, we might as well also add a nonnull
attribute to the rebalancing functions too.

libstdc++-v3/ChangeLog:

	PR libstdc++/108554
	* include/bits/stl_tree.h (_Rb_tree_insert_and_rebalance): Add
	nonnull attribute.
	(_Rb_tree_rebalance_for_erase): Add nonnull and returns_nonnull
	attributes.
	* testsuite/23_containers/map/modifiers/108554.cc: New test.
2023-01-26 13:38:22 +00:00
Jonathan Wakely 33ed110858 libstdc++: Include std::ranges::subrange definition in <tuple> [PR102301]
In order for std::make_from_tuple to work with tuple-like types, the
overloads of std::get for those types must have been declared before the
definition of std::make_from_tuple. That means we need to include the
definition of std::ranges::subrange in <tuple>.

The definitions of std::pair and its overloads of std::get are already
included in <tuple>. We provide forward declarations of std::array and
its std::get overloads in <tuple>. We could just declare subrange
without defining it, and give ranges::get a non-deduced return type,
like so:

  namespace ranges
  {
    enum class subrange_kind : bool { unsized, sized};

    template<input_or_output_iterator I, sentinel_for<I> S,
	     subrange_kind K>
      requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>)
      class subrange;

    template<size_t _Num, class _It, class _Sent, subrange_kind _Kind>
      requires (_Num < 2)
      constexpr __conditional_t<_Num == 0, _It, _Sent>
      get(const subrange<_It, _Sent, _Kind>& __r);

    template<size_t _Num, class _It, class _Sent, subrange_kind _Kind>
      requires (_Num < 2)
      constexpr __conditional_t<_Num == 0, _It, _Sent>
      get(subrange<_It, _Sent, _Kind>&& __r)
  }
  using ranges::get;

It is a bit late in the GCC 13 dev cycle to do this, so just include the
right headers for now.

Also add the dangling check to std::make_from_tuple added by P2255.

libstdc++-v3/ChangeLog:

	PR libstdc++/102301
	* include/bits/ranges_base.h: Include <bits/stl_iterator.h> for
	std::make_reverse_iterator.
	* include/std/tuple: Include <bits/ranges_util.h> for subrange.
	(make_from_tuple): Add static assertion from P2255 to diagnose
	dangling references.
	* testsuite/20_util/tuple/make_from_tuple/dangling_ref.cc: New test.
	* testsuite/20_util/tuple/make_from_tuple/tuple_like.cc: New test.
2023-01-24 23:46:42 +00:00
Jonathan Wakely 33237e93d5 libstdc++: Deprecate std::filesystem::u8path for C++20
P0482R6 deprecated these functions for C++20. There was a ballot comment
on the C++23 CD saying to un-deprecate it, but LEWG just rejected that,
so let's add attributes to deprecate them.

libstdc++-v3/ChangeLog:

	* include/bits/fs_path.h (u8path): Add deprecated attribute.
	* testsuite/27_io/filesystem/path/construct/90281.cc: Add
	-Wno-deprecated-declarations for C++20 and later.
	* testsuite/27_io/filesystem/path/factory/u8path-char8_t.cc:
	Likewise.
	* testsuite/27_io/filesystem/path/factory/u8path.cc: Likewise.
	* testsuite/27_io/filesystem/path/native/string.cc: Likewise.
	* testsuite/27_io/filesystem/path/factory/u8path-depr.cc: New test.
2023-01-18 21:47:58 +00:00
Jonathan Wakely 26c68b8c31 libstdc++: Fix std::random_device::entropy() for non-posix targets
Since the r12-4515-g58f339fc5eaae7 change std::random_device::entropy()
returns non-zero for hardware sources such as RDRAND. However, the call
to the underlying _M_getentropy function is conditionally compiled
according to #if _GLIBCXX_USE_DEV_RANDOM which means it only happens for
targets that support /dev/random and /dev/urandom. This means entropy()
always returns zero for x86 Windows, even though the RDRAND and RDSEED
sources work there.

The _M_getentropy() function is always compiled into the library, it
just doesn't get called for targets without /dev/random. We can change
that just by removing the #if conditional. This is not an ABI change,
because new code will just start calling the existing _M_getentropy
function, old code that has inlined entropy() will not call it.

Similarly, the std::random_device destructor doesn't call the underlying
_M_fini function unless _GLIBCXX_USE_DEV_RANDOM is defined. That's less
of a problem because it's still true that the only resources that need
to be freed are when one of /dev/random or /dev/urandom has been opened
for reading, which is only possible when _GLIBCXX_USE_DEV_RANDOM is
defined. The _M_fini function does also destroy a random engine object
if a std::linear_congruential_engine object is used, but that destructor
is trivial and so no resources are leaked if it's not called. Remove the
preprocessor condition in the destructor too, so that we always call the
_M_fini function even if it doesn't have side effects. This makes the
destructor non-trivial for Windows and bare metal targets, but as the
class is non-copyable that shouldn't cause any ABI change in practice.

libstdc++-v3/ChangeLog:

	* include/bits/random.h (random_device) [!_GLIBCXX_USE_DEV_RANDOM]:
	Always call _M_fini and _M_getentropy.
2023-01-18 21:47:58 +00:00
Jakub Jelinek 83ffe9cde7 Update copyright years. 2023-01-16 11:52:17 +01:00
Jonathan Wakely 9afc914809 libstdc++: Fix ostream insertion operators for calendar types
libstdc++-v3/ChangeLog:

	* include/bits/chrono_io.h (operator<<): Fix syntax errors.
	* testsuite/std/time/month_day/io.cc: New test.
	* testsuite/std/time/month_day_last/io.cc: New test.
	* testsuite/std/time/month_weekday/io.cc: New test.
	* testsuite/std/time/month_weekday_last/io.cc: New test.
	* testsuite/std/time/weekday_indexed/io.cc: New test.
	* testsuite/std/time/weekday_last/io.cc: New test.
	* testsuite/std/time/year_month/io.cc: New test.
	* testsuite/std/time/year_month_day_last/io.cc: New test.
	* testsuite/std/time/year_month_weekday/io.cc: New test.
	* testsuite/std/time/year_month_weekday_last/io.cc: New test.
2023-01-14 16:59:58 +00:00
Jonathan Wakely b4b1c6aa6d libstdc++: Add <errno.h> to <bits/std_mutex.h>
This needs to be included explicitly now that we don't include all of
<system_error> here.

libstdc++-v3/ChangeLog:

	* include/bits/std_mutex.h: Include <errno.h>.
2023-01-13 17:37:37 +00:00
Arsen Arsenović 42d3f74323 libstdc++: Enable string_view in freestanding
This enables the default contract handler in freestanding environments,
and, of course, provides freestanding users with string_view.

libstdc++-v3/ChangeLog:

	* include/Makefile.am: Install bits/char_traits.h,
	std/string_view
	* include/Makefile.in: Regenerate.
	* include/bits/char_traits.h: Gate hosted-only, wchar-only and
	mbstate-only bits behind appropriate #ifs.
	* include/std/string_view: Gate <iostream> functionality behind
	HOSTED.
	* include/std/version: Enable __cpp_lib_constexpr_string_view
	and __cpp_lib_starts_ends_with in !HOSTED.
	* include/std/ranges: Re-enable __is_basic_string_view on
	freestanding, include <string_view> directly.
	* include/precompiled/stdc++.h: Include <string_view> when
	!HOSTED too.
	* testsuite/20_util/function_objects/searchers.cc: Skip testing
	boyer_moore searchers on freestanding
	* testsuite/21_strings/basic_string_view/capacity/1.cc: Guard
	<string>-related tests behind __STDC_HOSTED__.
	* testsuite/21_strings/basic_string_view/cons/char/1.cc: Ditto.
	* testsuite/21_strings/basic_string_view/cons/char/2.cc: Remove
	unused <stdexcept> include.
	* testsuite/21_strings/basic_string_view/cons/char/3.cc: Remove
	unused <vector> include.
	* testsuite/21_strings/basic_string_view/cons/char/range.cc:
	Guard <string> related testing behind __STDC_HOSTED__.
	* testsuite/21_strings/basic_string_view/cons/wchar_t/1.cc:
	Guard <stdexcept> related tests behind __STDC_HOSTED__.
	* testsuite/21_strings/basic_string_view/element_access/char/1.cc:
	Ditto.
	* testsuite/21_strings/basic_string_view/element_access/wchar_t/1.cc:
	Guard <stdexcept> tests behind __STDC_HOSTED__.
	* testsuite/21_strings/basic_string_view/operations/contains/char/2.cc:
	Enable test on freestanding, guard <stdexcept> bits behind
	__STDC_HOSTED__.
	* testsuite/21_strings/basic_string_view/operations/substr/char.cc:
	Guard <stdexcept> bits behind __STDC_HOSTED__.
	* testsuite/21_strings/basic_string_view/operations/substr/wchar_t.cc:
	Ditto.
2023-01-13 13:34:21 +00:00
Jonathan Wakely 227351345d libstdc++: Do not include <system_error> in concurrency headers
The <condition_variable>, <mutex>, and <shared_mutex> headers use
std::errc constants, but don't use std::system_error itself. They only
use the __throw_system_error(int) function, which is defined in
<bits/functexcept.h>.

By including the header for the errc constants instead of the whole of
<system_error> we avoid depending on the whole std::string definition.

libstdc++-v3/ChangeLog:

	* include/bits/std_mutex.h: Remove <system_error> include.
	* include/std/condition_variable: Add <bits/error_constants.h>
	include.
	* include/std/mutex: Likewise.
	* include/std/shared_mutex: Likewise.
2023-01-13 00:15:01 +00:00
François Dumont b3c9148cad libstdc++: Remove _Alloc_node instance in _Rb_tree [PR107189]
libstdc++-v3/ChangeLog:

	PR libstdc++/107189
	* include/bits/stl_tree.h (_Rb_tree<>::_M_insert_range_equal): Remove
	unused _Alloc_node instance.
2023-01-12 19:39:29 +01:00
Jonathan Wakely dc22cf4612 libstdc++: Use lock-free type for __platform_wait_t
For non-futex targets the __platform_wait_t type is currently uint64_t,
but that requires a lock in libatomic for some 32-bit targets. We don't
really need a 64-bit type, so use unsigned long if that is lock-free,
and int otherwise. This should mean it's lock-free on a wider set of
targets.

libstdc++-v3/ChangeLog:

	* include/bits/atomic_wait.h (__detail::__platform_wait_t):
	Define as unsigned long if always lock-free, and unsigned int
	otherwise.
2023-01-12 11:01:09 +00:00
Jonathan Wakely 769fae76df libstdc++: Fix some algos for 16-bit size_t [PR108221]
Some standard algorithms fail to compile when size_t or ptrdiff_t is
narrower than int. The __lg helper function is ambiguous if ptrdiff_t is
short or __int20, so replace it with a function template that works for
those types as well as signed/unsigned int/long/long long. The helpers
for stable_sort perform arithmetic on size values and assume the types
won't change, which isn't true if the type promotes to int.

libstdc++-v3/ChangeLog:

	PR libstdc++/108221
	* include/bits/stl_algobase.h (__lg): Replace six overloads with
	a single function template for all integer types.
	* include/bits/stl_algo.h (__merge_adaptive_resize): Cast
	arithmetic results back to _Distance.
2023-01-10 10:09:21 +00:00
Patrick Palka f7bd48c6bb libstdc++: Add feature-test macros for implemented C++23 views [PR108260]
PR libstdc++/108260

libstdc++-v3/ChangeLog:

	* include/bits/utility.h (__cpp_lib_ranges_zip): Define for C++23.
	* include/std/ranges (__cpp_lib_ranges_zip): Likewise.
	(__cpp_lib_ranges_chunk): Likewise.
	(__cpp_lib_ranges_slide): Likewise.
	(__cpp_lib_ranges_chunk_by): Likewise.
	(__cpp_lib_ranges_join_with): Likewise.
	(__cpp_lib_ranges_repeat): Likewise.
	(__cpp_lib_ranges_stride): Likewise.
	(__cpp_lib_ranges_cartesian_product): Likewise.
	(__cpp_lib_ranges_as_rvalue): Likewise.
	* include/std/version: Ditto.
	* testsuite/20_util/tuple/p2321r2.cc: Verify value of
	feature-test macro.
	* testsuite/std/ranges/adaptors/as_rvalue/1.cc: Likewise.
	* testsuite/std/ranges/adaptors/chunk/1.cc: Likewise.
	* testsuite/std/ranges/adaptors/chunk_by/1.cc: Likewise.
	* testsuite/std/ranges/adaptors/join_with/1.cc: Likewise.
	* testsuite/std/ranges/adaptors/slide/1.cc: Likewise.
	* testsuite/std/ranges/adaptors/stride/1.cc: Likewise.
	* testsuite/std/ranges/cartesian_product/1.cc: Likewise.
	* testsuite/std/ranges/repeat/1.cc: Likewise.
	* testsuite/std/ranges/zip/1.cc: Likewise.
	* testsuite/std/ranges/version_c++23.cc: New test.
2023-01-06 10:32:10 -05:00
Jonathan Wakely f99b94865f libstdc++: Add std::format support to <chrono>
This adds the operator<< overloads and std::formatter specializations
required by C++20 so that <chrono> types can be written to ostreams and
printed with std::format.

libstdc++-v3/ChangeLog:

	* include/Makefile.am: Add new header.
	* include/Makefile.in: Regenerate.
	* include/std/chrono (operator<<): Move to new header.
	(nonexistent_local_time::_M_make_what_str): Define correctly.
	(ambiguous_local_time::_M_make_what_str): Likewise.
	* include/bits/chrono_io.h: New file.
	* src/c++20/tzdb.cc (operator<<(ostream&, const Rule&)): Use
	new ostream output for month and weekday types.
	* testsuite/20_util/duration/io.cc: Test std::format support.
	* testsuite/std/time/exceptions.cc: Check what() strings.
	* testsuite/std/time/syn_c++20.cc: Uncomment local_time_format.
	* testsuite/std/time/time_zone/get_info_local.cc: Enable check
	for formatted output of local_info objects.
	* testsuite/std/time/clock/file/io.cc: New test.
	* testsuite/std/time/clock/gps/io.cc: New test.
	* testsuite/std/time/clock/system/io.cc: New test.
	* testsuite/std/time/clock/tai/io.cc: New test.
	* testsuite/std/time/clock/utc/io.cc: New test.
	* testsuite/std/time/day/io.cc: New test.
	* testsuite/std/time/format.cc: New test.
	* testsuite/std/time/hh_mm_ss/io.cc: New test.
	* testsuite/std/time/month/io.cc: New test.
	* testsuite/std/time/weekday/io.cc: New test.
	* testsuite/std/time/year/io.cc: New test.
	* testsuite/std/time/year_month_day/io.cc: New test.
2022-12-22 23:34:27 +00:00
Jonathan Wakely d2d3826cd4 libstdc++: Define and use variable templates in <chrono>
Thi defines a variable template for the internal __is_duration helper
trait, defines a new __is_time_point_v variable template (to be used in
a subsequent commit), and adds explicit specializations of the standard
chrono::treat_as_floating_point trait for common types.

A fast path is added to chrono::duration_cast for the no-op case where
no conversion is needed.

Finally, some SFINAE constraints are simplified by using the
__enable_if_t alias, or by using variable templates.

libstdc++-v3/ChangeLog:

	* include/bits/chrono.h (__is_duration_v, __is_time_point_v):
	New variable templates.
	(duration_cast): Add simplified definition for noconv case.
	(treat_as_floating_point_v): Add explicit specializations.
	(duration::operator%=, floor, ceil, round): Simplify SFINAE
	constraints.
2022-12-22 10:14:52 +00:00
Jonathan Wakely 64c986b495 libstdc++: Diagnose broken allocator rebind members
This adds a static assertion to std::allocator_traits::rebind_alloc to
diagnose violations of the rule that rebinding an allocator to its own
value type yields the same allocator type.

This helps to catch the easy mistake of deriving from std::allocator but
forgetting to override the rebind behaviour (no longer an issue in C++20
as std::allocator doesn't have a rebind member that can be inherited).
It also catches bugs like in 23_containers/vector/52591.cc where a typo
means the rebound allocator is a completely different type.

I initially wanted to put this static assert into the body of
allocator_traits:

      static_assert(is_same<rebind_alloc<value_type>, _Alloc>::value,
		    "rebind_alloc<value_type> must be Alloc");

However, this causes a regression in the test for PR libstdc++/72792.
It seems that instantiating std::allocator_traits should be allowed for
invalid allocator types as long as you don't try to rebind them. To
support that, only assert in the __allocator_traits_base::__rebind class
template (in both the primary template and the partial specialization).
As a result, the bug in 20_util/scoped_allocator/outermost.cc is not
diagnosed, because nothing in that test rebinds the allocator.

libstdc++-v3/ChangeLog:

	* include/bits/alloc_traits.h (__allocator_traits_base::__rebind):
	Add static assert for rebind requirement.
	* testsuite/20_util/allocator_traits/members/rebind_alloc.cc:
	Fix invalid rebind member in test allocator.
	* testsuite/20_util/allocator_traits/requirements/rebind_neg.cc:
	New test.
	* testsuite/20_util/scoped_allocator/outermost.cc: Add rebind to
	test allocator.
	* testsuite/23_containers/forward_list/48101_neg.cc: Prune new
	static assert error.
	* testsuite/23_containers/unordered_multiset/48101_neg.cc:
	Likewise.
	* testsuite/23_containers/unordered_set/48101_neg.cc:
	Likewise.
	* testsuite/23_containers/vector/52591.cc: Fix typo in rebind.
2022-12-16 20:58:09 +00:00
Jonathan Wakely 92eb0adc14 libstdc++: Fix self-move for std::weak_ptr [PR108118]
I think an alternative fix would be something like:

  _M_ptr = std::exchange(rhs._M_ptr, nullptr);
  _M_refcount = std::move(rhs._M_refcount);

The standard's move-and-swap implementation generates smaller code at
all levels except -O0 and -Og, so it seems simplest to just do what the
standard says.

libstdc++-v3/ChangeLog:

	PR libstdc++/108118
	* include/bits/shared_ptr_base.h (weak_ptr::operator=):
	Implement as move-and-swap exactly as specified in the standard.
	* testsuite/20_util/weak_ptr/cons/self_move.cc: New test.
2022-12-16 12:59:08 +00:00
Jonathan Wakely 646e979c43 libstdc++: Add [[nodiscard]] to chrono conversion functions
Also add doxygen comments.

libstdc++-v3/ChangeLog:

	* include/bits/chrono.h (duration_cast, floor, round, abs, ceil)
	(time_point_cast): Add [[nodiscard]] attribute and doxygen
	comments.
	(treat_as_floating_point): Add doxygen commen.
2022-12-09 00:32:45 +00:00
Jonathan Wakely 7eec3114eb libstdc++: Change class-key for duration and time_point to class
We define these with the 'struct' keyword, but the standard uses
'class'. This results in warnings if users try to refer to them using
elaborated type specifiers.

libstdc++-v3/ChangeLog:

	* include/bits/chrono.h (duration, time_point): Change 'struct'
	to 'class'.
2022-12-09 00:32:44 +00:00
Jonathan Wakely 4ba94abf14 libstdc++: Add hint to compiler about vector invariants [PR106434]
The PR shows a bogus warning where jump threading generates code for the
undefined case that the insertion point is a value-initialized iterator
but _M_finish and _M_end_of_storage are unequal (so at least one must be
non-null). Using __builtin_unreachable() removes the bogus warning. Also
add an assertion to diagnose undefined misuses of a null iterator here,
so we don't just silently optimize that undefined code to something
unsafe.

libstdc++-v3/ChangeLog:

	PR c++/106434
	* include/bits/vector.tcc (insert(const_iterator, const T&)):
	Add assertion and optimization hint that the iterator for the
	insertion point must be non-null.
2022-12-06 21:33:29 +00:00
Jonathan Wakely af177d7280 libstdc++: Add nodiscard attribute to mutex try_lock functions
libstdc++-v3/ChangeLog:

	* include/bits/std_mutex.h (mutex): Add nodiscard attribute to
	try_lock member function.
	* include/bits/unique_lock.h (unique_lock): Likewise for
	try_lock, try_lock_until, try_lock_for member functions, and
	owns_lock and mutex member functions.
	* include/std/mutex (recursive_mutex): Likewise for try_lock
	member function.
	(timed_mutex, recursive_timed_mutex, try_lock): Likewise for
	try_lock, try_lock_until, try_lock_for member functions.
	(try_lock): Likewise for non-member function.
	* include/std/shared_mutex (shared_mutex): Likewise for try_lock
	and try_lock_shared member functions.
	(shared_timed_mutex): Likewise for try_lock, try_lock_for,
	try_lock_shared, try_lock_shared_for, try_lock_until, and
	try_lock_shared_until member functions.
	(shared_lock): Likewise for try_lock, try_lock, try_lock_for,
	try_lock_until, owns_lock, and mutex member functions.
	* testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc:
	Cast discarded value expression to void.
	* testsuite/30_threads/shared_lock/locking/3.cc: Likewise.
	* testsuite/30_threads/shared_lock/locking/4.cc: Likewise.
	* testsuite/30_threads/shared_lock/locking/clock_neg.cc:
	Likewise.
	* testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc:
	Likewise.
	* testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc:
	Likewise.
	* testsuite/30_threads/try_lock/4.cc: Likewise.
	* testsuite/30_threads/unique_lock/cons/60497.cc: Likewise.
	* testsuite/30_threads/unique_lock/locking/3.cc: Likewise.
	* testsuite/30_threads/unique_lock/locking/clock_neg.cc:
	Likewise.
2022-12-06 21:33:29 +00:00
Jonathan Wakely cca06f0d6d libstdc++: Avoid bogus warning in std::vector::insert [PR107852]
GCC assumes that any global variable might be modified by operator new,
and so in the testcase for this PR all data members get reloaded after
allocating new storage. By making local copies of the _M_start and
_M_finish members we avoid that, and then the compiler has enough info
to remove the dead branches that trigger bogus -Warray-bounds warnings.

libstdc++-v3/ChangeLog:

	PR libstdc++/107852
	PR libstdc++/106199
	PR libstdc++/100366
	* include/bits/vector.tcc (vector::_M_fill_insert): Copy
	_M_start and _M_finish members before allocating.
	(vector::_M_default_append): Likewise.
	(vector::_M_range_insert): Likewise.
2022-11-29 17:01:32 +00:00
Jonathan Wakely 81cf0354d5 libstdc++: Remove unnecessary tag dispatching in std::vector
There's no need to call a _M_xxx_dispatch function with a
statically-known __false_type tag, we can just directly call the
function that should be dispatched to. This will compile a tiny bit
faster and save a function call with optimization or inlining turned
off.

Also add the always_inline attribute to the __iterator_category helper
used for dispatching on the iterator category.

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator_base_types.h (__iterator_category):
	Add always_inline attribute.
	* include/bits/stl_vector.h (assign(Iter, Iter)): Call
	_M_assign_aux directly, instead of _M_assign_dispatch.
	(insert(const_iterator, Iter, Iter)): Call _M_range_insert
	directly instead of _M_insert_dispatch.
2022-11-29 16:01:08 +00:00
Jonathan Wakely a64775a0ed libstdc++: Make 16-bit std::subtract_with_carry_engine work [PR107466]
This implements the proposed resolution of LWG 3809, so that
std::subtract_with_carry_engine can be used with a 16-bit result_type.
Currently this produces a narrowing error when instantiating the
std::linear_congruential_engine to create the initial state. It also
truncates the default_seed constant when passing it as a result_type
argument.

Change the type of the constant to uint_least32_t and pass 0u when the
default_seed should be used.

libstdc++-v3/ChangeLog:

	PR libstdc++/107466
	* include/bits/random.h (subtract_with_carry_engine): Use 32-bit
	type for default seed. Use 0u as default argument for
	subtract_with_carry_engine(result_type) constructor and
	seed(result_type) member function.
	* include/bits/random.tcc (subtract_with_carry_engine): Use
	32-bit type for default seed and engine used for initial state.
	* testsuite/26_numerics/random/subtract_with_carry_engine/cons/lwg3809.cc:
	New test.
2022-11-28 15:02:04 +00:00
Jonathan Wakely f54ceb2062 libstdc++: Call predicate with non-const values in std::erase_if [PR107850]
As specified in the standard, the predicate for std::erase_if has to be
invocable as non-const with a non-const lvalues argument. Restore
support for predicates that only accept non-const arguments.

It's not strictly nevessary to change it for the set and unordered_set
overloads, because they only give const access to the elements anyway.
I've done it for them too just to keep them all consistent.

libstdc++-v3/ChangeLog:

	PR libstdc++/107850
	* include/bits/erase_if.h (__erase_nodes_if): Use non-const
	reference to the container.
	* include/experimental/map (erase_if): Likewise.
	* include/experimental/set (erase_if): Likewise.
	* include/experimental/unordered_map (erase_if): Likewise.
	* include/experimental/unordered_set (erase_if): Likewise.
	* include/std/map (erase_if): Likewise.
	* include/std/set (erase_if): Likewise.
	* include/std/unordered_map (erase_if): Likewise.
	* include/std/unordered_set (erase_if): Likewise.
	* testsuite/23_containers/map/erasure.cc: Check with
	const-incorrect predicate.
	* testsuite/23_containers/set/erasure.cc: Likewise.
	* testsuite/23_containers/unordered_map/erasure.cc: Likewise.
	* testsuite/23_containers/unordered_set/erasure.cc: Likewise.
	* testsuite/experimental/map/erasure.cc: Likewise.
	* testsuite/experimental/set/erasure.cc: Likewise.
	* testsuite/experimental/unordered_map/erasure.cc: Likewise.
	* testsuite/experimental/unordered_set/erasure.cc: Likewise.
2022-11-25 15:06:25 +00:00
Jonathan Wakely 48e4a9d938 libstdc++: Do not define operator!= in <random> for C++20
These overloads are not needed in C++20 as they can be synthesized by
the compiler. Removing them means less code to compile when including
these headers.

libstdc++-v3/ChangeLog:

	* include/bits/random.h [three_way_comparison] (operator!=):
	Do not define inequality operators when C++20 three way
	comparisons are supported.
	* include/ext/random [three_way_comparison] (operator!=):
	Likewise.
2022-11-25 15:01:50 +00:00
Jonathan Wakely 6bd8d11922 libstdc++: Add always_inline to trivial iterator operations
libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator_base_funcs.h (__distance):
	Add always_inline attribute to overload for random
	access iterators.
	(advance, distance, next, prev): Add always_inline attribute to
	inline functions that just forward to another function.
2022-11-25 15:01:49 +00:00
Jonathan Wakely ed77dcb9be libstdc++: Check static assertions earlier in chrono::duration
This ensures that we fail a static assertion before giving any other
errors. Instantiating chrono::duration<int, chrono::seconds> will now
print this before the other errors caused by it:

error: static assertion failed: period must be a specialization of ratio

libstdc++-v3/ChangeLog:

	* include/bits/chrono.h (duration): Check preconditions on
	template arguments before using them.
2022-11-21 17:46:42 +00:00
Jonathan Wakely 0723ad3902 libstdc++: Add always_inline to trivial range access functions
This makes all the [iterator.range] functions always-inline, except the
ones that construct a std::reverse_iterator, as they do a little more
work. They could probably be made always_inline too though, and maybe
the std::reverse_iterator constructor too.

This means that even for -O0 these functions have no runtime overhead
compared with calling a member of the container, or performing pointer
arithmetic for arrays.

libstdc++-v3/ChangeLog:

	* include/bits/range_access.h: Add always_inline attribute to
	trivial functions.
2022-11-19 17:44:14 +00:00
Jonathan Wakely fca0f50b14 libstdc++: Fix Doxygen warning
This fixes a Doxygen warning about a mismatched parameter name. The
standard uses 'r' here, like the Doxygen comment, so use '__r' instead
of '__e'.

libstdc++-v3/ChangeLog:

	* include/bits/ptr_traits.h (pointer_traits::pointer_to): Rename
	parameter.
2022-11-19 15:05:28 +00:00
Jonathan Wakely d4ba3b369c libstdc++: Allow std::to_chars for 128-bit integers in strict mode
This allows std::format to support __int128 when __STRICT_ANSI__ is
defined, which previously failed because __int128 is not an integral
type in strict mode.

With these changes, std::to_chars still rejects 128-bit integers in
strict mode, but std::format will be able to use __detail::__to_chars_i
for unsigned __int128.

libstdc++-v3/ChangeLog:

	* include/bits/charconv.h (__integer_to_chars_is_unsigned):
	New variable template.
	(__to_chars_len, __to_chars_10_impl): Use variable template in
	assertions to allow unsigned __int128 in strict mode.
	* include/std/charconv (__to_chars, __to_chars_16)
	(__to_chars_10, __to_chars_8, __to_chars_2): Likewise.
2022-11-13 01:10:44 +00:00
Nathaniel Shead 52672be7d3 libstdc++: Set active union member in constexpr std::string [PR103295]
Clang still complains about using std::string in constexpr contexts due
to the changes made in commit 98a0d72a. This patch ensures that we set
the active member of the union as according to [class.union.general] p6.

libstdc++-v3/ChangeLog:

	PR libstdc++/103295
	* include/bits/basic_string.h (_M_use_local_data): Set active
	member to _M_local_buf.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2022-11-11 17:57:37 +00:00
Jonathan Wakely b331bf303b libstdc++: Fix wstring conversions in filesystem::path [PR95048]
In commit r9-7381-g91756c4abc1757 I changed filesystem::path to use
std::codecvt<CharT, char, mbstate_t> for conversions from all wide
strings to UTF-8, instead of using std::codecvt_utf8<CharT>. This was
done because for 16-bit wchar_t, std::codecvt_utf8<wchar_t> only
supports UCS-2 and not UTF-16. The rationale for the change was sound,
but the actual fix was not. It's OK to use std::codecvt for char16_t or
char32_t, because the specializations for those types always use UTF-8 ,
but std::codecvt<wchar_t, char, mbstate_t> uses the current locale's
encodings, and the narrow encoding is probably ASCII and can't support
non-ASCII characters.

The correct fix is to use std::codecvt only for char16_t and char32_t.
For 32-bit wchar_t we could have continued using std::codecvt_utf8
because that uses UTF-32 which is fine, switching to std::codecvt broke
non-Windows targets with 32-bit wchar_t. For 16-bit wchar_t we did need
to change, but should have changed to std::codecvt_utf8_utf16<wchar_t>
instead, as that always uses UTF-16 not UCS-2. I actually noted that in
the commit message for r9-7381-g91756c4abc1757 but didn't use that
option. Oops.

This replaces the unconditional std::codecvt<CharT, char, mbstate_t>
with a type defined via template specialization, so it can vary
depending on the wide character type. The code is also simplified to
remove some of the mess of #ifdef and if-constexpr conditions.

libstdc++-v3/ChangeLog:

	PR libstdc++/95048
	* include/bits/fs_path.h (path::_Codecvt): New class template
	that selects the kind of code conversion done.
	(path::_Codecvt<wchar_t>): Select based on sizeof(wchar_t).
	(_GLIBCXX_CONV_FROM_UTF8): New macro to allow the same code to
	be used for Windows and POSIX.
	(path::_S_convert(const EcharT*, const EcharT*)): Simplify by
	using _Codecvt and _GLIBCXX_CONV_FROM_UTF8 abstractions.
	(path::_S_str_convert(basic_string_view<value_type>, const A&)):
	Simplify nested conditions.
	* include/experimental/bits/fs_path.h (path::_Cvt): Define
	nested typedef controlling type of code conversion done.
	(path::_Cvt::_S_wconvert): Use new typedef.
	(path::string(const A&)): Likewise.
	* testsuite/27_io/filesystem/path/construct/95048.cc: New test.
	* testsuite/experimental/filesystem/path/construct/95048.cc: New
	test.
2022-11-11 17:16:42 +00:00
Jonathan Wakely b3ac43a3c0 libstdc++: Avoid redundant checks in std::use_facet [PR103755]
We do not need to do bounds checks or a runtime dynamic_cast when using
std::has_facet and std::use_facet to access the default facets that are
guaranteed to be present in every std::locale object. We can just index
straight into the array and use a static_cast for the conversion.

This patch adds a new std::__try_use_facet function that is like
std::use_facet but returns a pointer, so can be used to implement both
std::has_facet and std::use_facet. We can then do the necessary
metaprogramming to skip the redundant checks in std::__try_use_facet.

To avoid having to export (or hide) instantiations of the new function
from libstdc++.so the instantiations are given hidden visibility. This
allows them to be used in the library, but user code will instantiate it
again using the definition in the header. That would happen anyway,
because there are no explicit instantiation declarations for any of
std::has_facet, std::use_facet, or the new std::__try_use_facet.

libstdc++-v3/ChangeLog:

	PR libstdc++/103755
	* config/abi/pre/gnu.ver: Tighten patterns for facets in the
	base version. Add exports for __try_use_facet.
	* include/bits/basic_ios.tcc (basic_ios::_M_cache_locale): Use
	__try_use_facet instead of has_facet and use_facet.
	* include/bits/fstream.tcc (basic_filebuf::basic_filebuf()):
	Likewise.
	(basic_filebuf::imbue): Likewise.
	* include/bits/locale_classes.h (locale, locale::id)
	(locale::_Impl): Declare __try_use_facet as a friend.
	* include/bits/locale_classes.tcc (__try_use_facet): Define new
	function template with special cases for default facets.
	(has_facet, use_facet): Call __try_use_facet.
	* include/bits/locale_facets.tcc (__try_use_facet): Declare
	explicit instantiations.
	* include/bits/locale_facets_nonio.tcc (__try_use_facet):
	Likewise.
	* src/c++11/locale-inst-monetary.h (INSTANTIATE_FACET_ACCESSORS):
	Use new macro for facet accessor instantiations.
	* src/c++11/locale-inst-numeric.h (INSTANTIATE_FACET_ACCESSORS):
	Likewise.
	* src/c++11/locale-inst.cc (INSTANTIATE_USE_FACET): Define new
	macro for instantiating __try_use_facet and use_facet.
	(INSTANTIATE_FACET_ACCESSORS): Define new macro for also
	defining has_facet.
	* src/c++98/compatibility-ldbl.cc (__try_use_facet):
	Instantiate.
	* testsuite/22_locale/ctype/is/string/89728_neg.cc: Adjust
	expected errors.
2022-11-11 04:00:58 +00:00
Jonathan Wakely 8f6d25f19b libstdc++: Fix -Wsystem-headers warnings
Fix some problems noticed with -Wsystem-headers.

libstdc++-v3/ChangeLog:

	* include/bits/stl_tempbuf.h (_Temporary_buffer): Disable
	warnings about get_temporary_buffer being deprecated.
	* include/ext/functional (mem_fun1, mem_fun1_ref): Disable
	warnings about mem_fun1_t, const_mem_fun1_t, mem_fun1_ref_t and
	const_mem_fun1_ref_t being deprecated.
	* include/std/array (__array_traits<T, 0>): Remove artificial
	attributes which give warnings about being ignored.
	* include/std/spanstream (basic_spanbuf::setbuf): Add assertion
	and adjust to avoid narrowing warning.
	* libsupc++/exception_ptr.h [!__cpp_rtti && !__cpp_exceptions]
	(make_exception_ptr): Add missing inline specifier.
2022-11-08 17:35:15 +00:00