12810 Commits

Author SHA1 Message Date
Jonathan Wakely
9665c2e768 libstdc++: Add noexcept to some std::function internals
libstdc++-v3/ChangeLog:

	* include/bits/std_function.h (_Any_data::_M_access): Add
	noexcept.
	(_Function_base::_Base_manager::_M_get_pointer): Likewise.
	(_Function_base::_Base_manager::_M_not_empty_function):
	Likewise.
2021-10-05 09:35:47 +01:00
Jonathan Wakely
96955a82f0 libstdc++: Support printing volatile pointers (P1147R1)
To avoid needing to export a new symbol from the library (for now) the
new member function uses __attribute__((always_inline)).

libstdc++-v3/ChangeLog:

	* include/std/ostream (operator<<(const volatile void*)):
	Add new overload, as per P1147R1.
	* testsuite/27_io/basic_ostream/inserters_other/char/volatile_ptr.cc:
	New test.
2021-10-05 09:35:47 +01:00
Jonathan Wakely
9e136807c5 libstdc++: Update __cpp_lib_adaptor_iterator_pair_constructor value
I started implementing this feature before it was voted into the C++ WP,
and forgot to update the feature test macro after it was approved.

This defines it to the correct value, as specified in the C++23 draft.

libstdc++-v3/ChangeLog:

	* include/bits/stl_queue.h
	(__cpp_lib_adaptor_iterator_pair_constructor): Set to correct
	value.
	* include/bits/stl_stack.h
	(__cpp_lib_adaptor_iterator_pair_constructor): Likewise.
	* include/std/version
	(__cpp_lib_adaptor_iterator_pair_constructor): Likewise.
	* testsuite/23_containers/queue/cons_from_iters.cc: Update
	expected value.
	* testsuite/23_containers/stack/cons_from_iters.cc: Likewise.
2021-10-05 09:35:46 +01:00
GCC Administrator
da9c5f7856 Daily bump. 2021-10-05 00:16:29 +00:00
Jonathan Wakely
22d34a2a50 libstdc++: Implement P1518R2 for container deduction guides
This implements the C++23 P1518R2 proposal "Stop overconstraining
allocators in container deduction guides" as a fix for C++17 and C++20
too.

The changes allow class template argument deduction to ignore the type
of a constructor argument that initializes an allocator_type parameter
if the type should be deducible only from the other arguments. So for
the constructor vector(const vector&, const allocator_type&) only the
first argument is used for deduction, allowing the second argument to be
anything that is implicitly convertible to argument_type. Previously
deduction would fail or an ill-formed type would be deduced if the
second argument wasn't of type allocator_type.

The unordered containers do not need changes, because their
allocator-extended constructors use the allocator_type alias, which
comes from the dependent base class so is already a non-deduced context.

libstdc++-v3/ChangeLog:

	* include/bits/forward_list.h (forward_list): Use non-deduced
	context for allocator parameter of allocator-extended copy and
	move constructors.
	* include/bits/stl_bvector.h (vector<bool>): Likewise.
	* include/bits/stl_deque.h (deque): Likewise.
	* include/bits/stl_list.h (list): Likewise.
	* include/bits/stl_map.h (map): Likewise.
	* include/bits/stl_multimap.h (multimap): Likewise.
	* include/bits/stl_multiset.h (multiset): Likewise.
	* include/bits/stl_set.h (set): Likewise.
	* include/bits/stl_vector.h (vector): Likewise.
	* include/bits/stl_queue.h (queue, priority_queue): Do not
	constrain Allocator template parameter of deduction guides that
	have a Container parameter.
	* include/bits/stl_stack.h (stack): Likewise.
	* include/debug/deque (__gnu_debug::deque): Use non-deduced
	context for allocator parameter of allocator-extended copy and
	move constructors.
	* include/debug/list (__gnu_debug::list): Likewise.
	* include/debug/map.h (__gnu_debug::map): Likewise.
	* include/debug/multimap.h (__gnu_debug::multimap): Likewise.
	* include/debug/multiset.h (__gnu_debug::multiset): Likewise.
	* include/debug/set.h (__gnu_debug::set): Likewise.
	* include/debug/vector (__gnu_debug::vector): Likewise.
	* testsuite/23_containers/deque/cons/deduction.cc: Test class
	template argument deduction with non-deduced allocator
	arguments.
	* testsuite/23_containers/forward_list/cons/deduction.cc:
	Likewise.
	* testsuite/23_containers/list/cons/deduction.cc: Likewise.
	* testsuite/23_containers/map/cons/deduction.cc: Likewise.
	* testsuite/23_containers/multimap/cons/deduction.cc: Likewise.
	* testsuite/23_containers/multiset/cons/deduction.cc: Likewise.
	* testsuite/23_containers/priority_queue/deduction.cc: Likewise.
	* testsuite/23_containers/queue/deduction.cc: Likewise.
	* testsuite/23_containers/set/cons/deduction.cc: Likewise.
	* testsuite/23_containers/stack/deduction.cc: Likewise.
	* testsuite/23_containers/unordered_map/cons/deduction.cc:
	Likewise.
	* testsuite/23_containers/unordered_multimap/cons/deduction.cc:
	Likewise.
	* testsuite/23_containers/unordered_multiset/cons/deduction.cc:
	Likewise.
	* testsuite/23_containers/unordered_set/cons/deduction.cc:
	Likewise.
	* testsuite/23_containers/vector/cons/deduction.cc: Likewise.
2021-10-04 15:23:28 +01:00
Jonathan Wakely
728e639d82 libstdc++: Add missing noexcept to std::variant helper
libstdc++-v3/ChangeLog:

	* include/std/variant (__detail::__variant::__as): Add missing
	noexcept to first overload.
2021-10-04 15:23:28 +01:00
Jonathan Wakely
cf876562c5 libstdc++: Disable std::string{,_view} construction from nullptr (P2166R1)
Implement this C++23 feature. Because construction from a null pointer
is undefined, we can implement it for C++11 and up, turning undefined
behaviour into a compilation error.

libstdc++-v3/ChangeLog:

	* include/bits/basic_string.h (basic_string(nullptr_t)): Define
	as deleted.
	(operator=(nullptr_t)): Likewise.
	* include/bits/cow_string.h (basic_string(nullptr_t)): Likewise.
	(operator=(nullptr_t)): Likewise.
	* include/std/string_view (basic_string_view(nullptr_t)):
	Likewise.
	* testsuite/21_strings/basic_string/cons/char/nullptr.cc: New test.
	* testsuite/21_strings/basic_string_view/cons/char/nonnull.cc:
	Change dg-warning to dg-error.
	* testsuite/21_strings/basic_string_view/cons/wchar_t/nonnull.cc:
	Likewise.
2021-10-04 15:23:28 +01:00
GCC Administrator
e3e07b8955 Daily bump. 2021-10-03 00:16:17 +00:00
Jonathan Wakely
b7848a2068 libstdc++: Fix typos in std::filesystem code
There were a couple of typos in r12-4070 and r12-4071 which don't show
up when building for POSIX targets.

libstdc++-v3/ChangeLog:

	* src/c++17/fs_ops.cc (create_directory): Fix typo in enum name.
	* src/filesystem/ops-common.h (__last_system_error): Add
	explicit cast to avoid narrowing conversion.
	(do_space): Fix type in function name.
2021-10-02 21:20:05 +01:00
GCC Administrator
9d116bcc55 Daily bump. 2021-10-02 00:16:31 +00:00
Jonathan Wakely
92936be474 libstdc++: Restore printing of assertion messages [PR102100]
My changes for PR 101429 broke the _-replacement_assert function,
because we now always just abort without printing anything. That's
because I added checks for _GLIBCXX_HOSTED and _GLIBCXX_VERBOSE, but the
checks are done before those get defined.

This adds a new macro which is set
by the sed command in include/Makefile, once the HOSTED and VERBOSE
macros have been set by the configure script.

libstdc++-v3/ChangeLog:

	PR libstdc++/102100
	* include/Makefile.am (c++config.h): Define
	_GLIBCXX_VERBOSE_ASSERT based on configure output.
	* include/Makefile.in: Regenerate.
	* include/bits/c++config: Fix condition for verbose assertions.
2021-10-01 21:06:26 +01:00
Jonathan Wakely
acf3a21cbc libstdc++: Reduce header dependencies for C++20 std::erase [PR92546]
This reduces the preprocessed size of <deque>, <string> and <vector> by
not including <bits/stl_algo.h> for std::remove and std::remove_if.

Also unwrap iterators using __niter_base, to avoid redundant debug mode
checks.

	PR libstdc++/92546
	* include/bits/erase_if.h (__erase_nodes_if): Use __niter_base to
	unwrap debug iterators.
	* include/bits/refwrap.h: Do not error if included in C++03.
	* include/bits/stl_algo.h (__remove_if): Move to ...
	* include/bits/stl_algobase.h (__remove_if): ... here.
	* include/std/deque (erase, erase_if): Use __remove_if instead of
	remove and remove_if.
	* include/std/string (erase, erase_if): Likewise.
	* include/std/vector (erase, erase_if): Likewise.
2021-10-01 20:37:02 +01:00
Jonathan Wakely
ff7793bea4 libstdc++: Allow stateful allocators in std::list::sort [PR 66742]
The temporary lists used by std::list::sort are default constructed,
which means they use default constructed allocators. The sort operation
is defined in terms of merge and splice operations, which have undefined
behaviour (and abort) if the allocators do not compare equal. This means
it is not possible to sort a list that uses an allocator that compares
unequal to an default constructed allocator.

The solution is to avoid using temporary std::list objects at all. We do
not need to be able to allocate memory because no nodes are allocated,
only spliced from one list to another. That means the temporary lists
don't need an allocator at all, so whether it would compare equal
doesn't matter.

Instead of temporary std::list objects, we can just use a collection of
_List_node_base objects that nodes can be spliced onto as needed. Those
objects are wrapped in a _Scratch_list type that implements the splicing
and merging operations used by list::sort.

We also don't need to update the list size during the sort, because
sorting doesn't alter the number of nodes. Although we move nodes in and
out of the scratch lists, at the end of the function all nodes are back
in the original std::list and the scratch lists are empty.  So for the
cxx11 ABI we can avoid the _M_size modifications usually done when
splicing nodes.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/66742
	* include/bits/list.tcc (list::sort()): Use _Scratch_list
	objects for splicing and merging.
	(list::sort(StrictWeakOrdering)): Likewise.
	* include/bits/stl_list.h (__detail::_Scratch_list): New type.
	* src/c++98/list.cc (_List_node_base::_M_transfer): Add
	assertion for --enable-libstdcxx-debug library.
	* testsuite/23_containers/list/operations/66742.cc: New test.
2021-10-01 20:36:56 +01:00
Jonathan Wakely
34e9407b3b libstdc++: Make std::jthread support pointers to member functions [PR 100612]
This adds a non-standard extension to support initializing a
std::jthread with a pointer to a member function that expects a
stop_token to be added to the arguments. That use case is not supported
by C++20, because the stop_token would get added as the first argument,
which is where the object argument needs to be to invoke a pointer to
member function.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/100612
	* include/std/thread (__pmf_expects_stop_token): New variable
	template to detect a pointer to member function that needs a
	stop_token to be added to the arguments.
	(jthread::__S_create): Use __pmf_expects_stop_token.
	(jthread::__S_create_pmf): New function.
	* testsuite/30_threads/jthread/100612.cc: New test.
2021-10-01 20:36:55 +01:00
Jonathan Wakely
b7e8fb5e48 libstdc++: Add container adaptor constructors taking iterators (P1425R4)
This adds a feature that was recently added to the C++23 working draft.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/stl_queue.h
	(__cpp_lib_adaptor_iterator_pair_constructor): Define for C++23, as
	per P1425R4.
	(queue(InputIterator, InputIterator)): Likewise.
	(queue(InputIterator, InputIterator, const Alloc&)): Likewise.
	* include/bits/stl_stack.h
	(__cpp_lib_adaptor_iterator_pair_constructor): Likewise.
	(stack(InputIterator, InputIterator)): Likewise.
	(stack(InputIterator, InputIterator, const Alloc&)): Likewise.
	* include/std/version (__cpp_lib_adaptor_iterator_pair_constructor):
	Define.
	* testsuite/23_containers/queue/cons_from_iters.cc: New test.
	* testsuite/23_containers/stack/cons_from_iters.cc: New test.
2021-10-01 20:36:55 +01:00
Jonathan Wakely
6ccffeb56b libstdc++: Implement LWG 3506 for std::priority_queue
The LWG 3506 issue ads allocator-extended versions of the constructors
that take iterator arguments.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/stl_queue.h (priority_queue): Add
	allocator-extended overloads for constructors taking iterator.
	* testsuite/23_containers/priority_queue/lwg3506.cc: New test.
2021-10-01 20:36:55 +01:00
Jonathan Wakely
e79bde6ada libstdc++: Implement LWG 3529 for std::priority_queue
The LWG 3529 issue changes to use two overloads instead of one with a
default argument, so that the sequence can be initialized directly with
the iterator range when no sequence argument is provided.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/stl_queue.h (priority_queue): Construct sequence
	from iterators when no sequence argument is present (LWG 3529).
	* testsuite/23_containers/priority_queue/lwg3529.cc: New test.
2021-10-01 20:36:55 +01:00
Jonathan Wakely
e5c093e515 libstdc++: Implement LWG 3522 for std::priority_queue
The LWG 3522 issue constrains all constructors of container adaptors
that have InputIterator parameters.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/stl_queue.h (priority_queue): Constrain
	constructors with InputIterator parameters (LWG 3522).
	* testsuite/23_containers/priority_queue/lwg3522.cc: New test.
2021-10-01 20:36:55 +01:00
Jonathan Wakely
20751fad19 libstdc++: Implement LWG 3392 for std::ranges::distance
libstdc++-v3/ChangeLog:

	* include/bits/ranges_base.h (ranges::distance): Split overload
	into two (LWG 3392).
	* testsuite/24_iterators/range_operations/lwg3392.cc: New test.
2021-10-01 20:36:54 +01:00
Jonathan Wakely
9b790acc22 libstdc++: Remove unary_function base classes from std::thread tests
std::thread does not care if a function object is adaptable, so there is
no need to derive from the deprecated std::unary_function class in these
tests.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* testsuite/30_threads/thread/cons/3.cc: Remove derivation from
	std::unary_function.
	* testsuite/30_threads/thread/cons/4.cc: Likewise.
	* testsuite/30_threads/thread/cons/5.cc: Likewise.
2021-10-01 20:36:54 +01:00
Jonathan Wakely
e3869a48fc libstdc++: Remove useless base classes in pb_db tests
These function objects do not need to be adaptable, so stop deriving
from deprecated classes. Also the 'inline' keyword is redundant on
member functions defined in the class body.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* testsuite/ext/pb_ds/example/basic_multimap.cc: Remove
	unnecesary derivation from std::unary_function.
	* testsuite/ext/pb_ds/example/erase_if.cc: Likewise.
	* testsuite/ext/pb_ds/example/hash_illegal_resize.cc: Likewise.
	* testsuite/ext/pb_ds/example/hash_initial_size.cc: Likewise.
	* testsuite/ext/pb_ds/example/hash_load_set_change.cc: Likewise.
	* testsuite/ext/pb_ds/example/hash_mod.cc: Likewise.
	* testsuite/ext/pb_ds/example/hash_resize.cc: Likewise.
	* testsuite/ext/pb_ds/example/hash_shift_mask.cc: Likewise.
	* testsuite/ext/pb_ds/example/priority_queue_dijkstra.cc:
	Likewise.
	* testsuite/ext/pb_ds/example/ranged_hash.cc: Likewise.
	* testsuite/ext/pb_ds/example/store_hash.cc: Likewise.
2021-10-01 20:36:54 +01:00
Jonathan Wakely
44967af830 libstdc++: Simplify __throw_out_of_range_fmt for freestanding
There is no point expanding the format string if we're just going to
abort instead of throw an exception. And for freestanding or non-verbose
builds we shouldn't do it either, to reduce the binary size.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* src/c++11/functexcept.cc (__throw_out_of_range_fmt): Do not
	expand the format string for freestanding, or non-vebose, or if
	we're just going to abort anyway.
	* src/c++11/snprintf_lite.cc: Remove unused header and
	declaration.
2021-10-01 20:36:54 +01:00
Jonathan Wakely
dc1b29508d libstdc++: Fix narrowing conversion in std::visit
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/std/variant (__do_visit): Use variant_npos instead of
	literal -1 that requires a narrowing conversion.
2021-10-01 20:36:53 +01:00
Jonathan Wakely
59ffa3e3db libstdc++: Avoid unconditional use of errc::not_supported [PR 99327]
The errc::not_supported constant is only defined if ENOTSUP is defined,
which is not true for all targets. Many uses of errc::not_supported in
the filesystem library do not actually match the intended meaning of
ENOTSUP described by POSIX. They should be using ENOSYS instead
(i.e. errc::function_not_supported).

This change ensures that appropriate error codes are used by the
filesystem library. The remaining uses of errc::not_supported are
replaced with a call to a new helper function so that an alternative
value will be used on targets that don't support errc::not_supported.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/99327
	* src/filesystem/ops-common.h (__unsupported): New function to
	return a suitable error code for missing functionality.
	(posix::off_t): New typedef.
	(posix::*): Set errno to ENOSYS instead of ENOTSUP for no-op
	fallback implementations.
	(do_copy_file): Replace uses of errc::not_supported.
	* src/c++17/fs_ops.cc (fs::copy, fs::copy_file, create_dir)
	(fs::create_directory, fs::create_directory_symlink)
	(fs::create_hard_link, fs::create_symlink, fs::current_path)
	(fs::equivalent, do_stat, fs::file_size, fs::hard_link_count)
	(fs::last_write_time, fs::permissions, fs::read_symlink):
	Replace uses of errc::not_supported.
	(fs::resize_file): Qualify off_t.
	* src/filesystem/ops.cc (fs::copy, fs::copy_file, create_dir)
	(fs::create_directory, fs::create_directory_symlink)
	(fs::create_hard_link, fs::create_symlink, fs::current_path)
	(fs::equivalent, do_stat, fs::file_size, fs::last_write_time)
	(fs::permissions, fs::read_symlink, fs::system_complete):
	Replace uses of errc::not_supported.
	(fs::resize_file): Qualify off_t and enable unconditionally.
	* testsuite/19_diagnostics/system_error/cons-1.cc: Likewise.
2021-10-01 20:34:50 +01:00
Jonathan Wakely
d71476c9df libstdc++: Add utility for creating std::error_code from OS errors
This adds a helper function to encapsulate obtaining an error code for
errors from OS calls. For Windows we want to use GetLastError() and the
system error category, but otherwise just use errno and the generic
error category.

This should not be used to replace existing uses of
ec.assign(errno, generic_category()) because in those cases we really do
want to get the value of errno, not a system-specific error. Only the
cases that currently use GetLastError() are replace by this new
function.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* src/filesystem/ops-common.h (last_error): New helper function.
	(filesystem::do_space): Use last_error().
	* src/c++17/fs_ops.cc (fs::absolute, fs::create_hard_link)
	(fs::equivalent, fs::remove, fs::temp_directory_path): Use
	last_error().
	* src/filesystem/ops.cc (fs::create_hard_link)
	(fs::remove, fs::temp_directory_path): Likewise.
2021-10-01 20:34:49 +01:00
Jonathan Wakely
a09bb4a852 libstdc++: Add std::__conditional_t alias template
This change is inspired by the suggestion in
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1715r0.html

The new std::__conditional_t alias template is functionally equivalent
to std::conditional_t but should be more efficient to compile, due to
only ever instantiating two specializations (std::__conditional<true>
and std::__conditional<false>) rather than a new specialization for
every use of std::conditional.

The new alias template is also available in C++11, unlike the C++14
std::conditional_t alias.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/std/type_traits (__conditional): New class template
	for internal uses of std::conditional.
	(__conditional_t): New alias template to replace conditional_t.
	(__and_, __or_, __result_of_memfun, __result_of_memobj): Use
	__conditional_t instead of conditional::type.
	* include/bits/atomic_base.h (__atomic_impl::_Diff): Likewise.
	* include/bits/hashtable.h (_Hashtable): Likewise.
	* include/bits/hashtable_policy.h (_Node_iterator, _Insert_base)
	(_Local_iterator): Likewise. Replace typedefs with
	using-declarations.
	* include/bits/move.h (move_if_noexcept): Use __conditional_t.
	* include/bits/parse_numbers.h (_Select_int_base): Likewise.
	* include/bits/ptr_traits.h (__make_not_void): Likewise.
	* include/bits/ranges_algobase.h (__copy_or_move_backward)
	(__copy_or_move): Likewise.
	* include/bits/ranges_base.h (borrowed_iterator_t): Likewise.
	* include/bits/ranges_util.h (borrowed_subrange_t): Likewise.
	* include/bits/regex_compiler.h (_BracketMatcher): Use
	__conditional_t. Replace typedefs with using-declarations.
	* include/bits/shared_ptr_base.h (__shared_count): Use
	__conditional_t.
	* include/bits/stl_algobase.h (__copy_move, __copy_move_backward):
	Likewise.
	* include/bits/stl_iterator.h (__detail::__clamp_iter_cat)
	(reverse_iterator::iterator_concept)
	(__make_move_if_noexcept_iterator)
	(iterator_traits<common_iterator<_It, _Sent>>)
	(iterator_traits<counted_iterator<_It>>): Likewise.
	* include/bits/stl_pair.h (_PCC, pair::operator=): Likewise.
	* include/bits/stl_tree.h (_Rb_tree::insert_return_type)
	(_Rb_tree::_M_clone_node): Likewise.
	* include/bits/unique_ptr.h (unique_ptr(unique_ptr<U,E>&&)):
	Likewise.
	* include/bits/uses_allocator.h (__uses_alloc): Likewise.
	(__is_uses_allocator_predicate): Likewise.
	* include/debug/functions.h (__foreign_iterator_aux2): Likewise.
	* include/experimental/any (any::_Manager, __any_caster):
	Likewise.
	* include/experimental/executor (async_completion): Likewise.
	* include/experimental/functional (__boyer_moore_base_t):
	Likewise.
	* include/std/any (any::_Manager): Likewise.
	* include/std/functional (__boyer_moore_base_t): Likewise.
	* include/std/ranges (borrowed_iterator_t)
	(borrowed_subrange_t, __detail::__maybe_present_t)
	(__detail::__maybe_const_t, split_view): Likewise.
	* include/std/tuple (__empty_not_final, tuple::operator=):
	Likewise.
	* include/std/variant (__detail::__variant::__get_t): Likewise.
2021-10-01 20:34:49 +01:00
Jonathan Wakely
cfb582f627 libstdc++: Optimize std::visit for the common case [PR 78113]
GCC does not do a good job of optimizing the table of function pointers
used for variant visitation. This avoids using the table for the common
case of visiting a single variant with a small number of alternative
types. Instead we use:

  switch(v.index())
  {
  case 0: return visitor(get<0>(v));
  case 1: return visitor(get<1>(v));
  ...
  }

It's not quite that simple, because get<1>(v) is ill-formed if the
variant only has one alternative, and similarly for each get<N>.  We
need to ensure each case only applies the visitor if the index is in
range for the actual type we're dealing with, and tell the compiler that
the case is unreachable otherwise. We also need to invoke the visitor
via the __gen_vtable_impl::__visit_invoke function, to handle the raw
visitation cases used to implement std::variant assignments and
comparisons.

Because that gets quite verbose and repetitive, a macro is used to stamp
out the cases.

We also need to handle the valueless_by_exception case, but only for raw
visitation, because std::visit already checks for it before calling
__do_visit.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/78113
	* include/std/variant (__do_visit): Use a switch when we have a
	single variant with a small number of alternatives.
2021-10-01 20:34:48 +01:00
Jonathan Wakely
c46ecb0112 libstdc++: Allow visiting inherited variants [PR 90943]
Implement the changes from P2162R2 (as a DR for C++17).

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/90943
	* include/std/variant (__cpp_lib_variant): Update value.
	(__detail::__variant::__as): New helpers implementing the
	as-variant exposition-only function templates.
	(visit, visit<R>): Use __as to upcast the variant parameters.
	* include/std/version (__cpp_lib_variant): Update value.
	* testsuite/20_util/variant/visit_inherited.cc: New test.
2021-10-01 20:34:48 +01:00
Jonathan Wakely
fb4d55ef61 libstdc++: Simplify __normal_iterator converting constructor
This uses C++11 features to simplify the definition of the
__normal_iterator constructor that allows converting from iterator to
const_iterator. The previous definition relied on _Container::pointer
which is present in std::vector and std::basic_string, but is not
actually part of the container requirements.

Removing the use of _Container::pointer and defining it in terms of
is_convertible allows __normal_iterator to be used with new container
types which do not define a pointer member. Specifically, this will
allow it to be used in std::basic_stacktrace.

In theory this will enable some conversions which were not previously
permitted, for example __normal_iterator<volatile T*, vector<T>> can
now be converted to __normal_iterator<const volatile T*, vector<T>>.
In practice this doesn't matter because the library never uses such
types.  In any case, allowing those conversions is consistent with
the corresponding constructors of std::reverse_iterator and
std::move_iterator.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (__normal_iterator): Simplify
	converting constructor and do not require _Container::pointer.
2021-10-01 20:34:48 +01:00
Jonathan Wakely
10b6d89bad libstdc++: Make move ctor noexcept for fully-dynamic string
The move constructor for the "fully-dynamic" COW string is not noexcept,
because it allocates a new empty string rep for the moved-from string.
However, there is no need to do that, because the moved-from string does
not have to be left empty. Instead, implement move construction for the
fully-dynamic case as a reference count increment, so the string is
shared.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/cow_string.h [_GLIBCXX_FULLY_DYNAMIC_STRING]
	(basic_string(basic_string&&)): Add noexcept and avoid
	allocation, by sharing rep with the rvalue string.
2021-10-01 20:34:47 +01:00
Jonathan Wakely
ce709ad3dc libstdc++: Add noexcept to common_iterator proxy operators
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (common_iterator::__arrow_proxy)
	(common_iterator::__postfix_proxy): Add noexcept.
2021-10-01 20:34:47 +01:00
Jonathan Wakely
d335d73889 libstdc++: Use conditional noexcept in std::reverse_iterator [PR 94418]
This adds a noexcept-specifier to each constructor and assignment
operator of std::reverse_iterator so that they are noexcept when the
corresponding operation on the underlying iterator is noexcept.

The std::reverse_iterator class template already requires that the
operations on the underlying type are valid, so we don't need to use the
std::is_nothrow_xxx traits to protect against errors when the expression
isn't even valid. We can just use a noexcept operator to test if the
expression can throw, without the overhead of redundantly checking if
the initialization/assignment would be valid.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/94418
	* include/bits/stl_iterator.h (reverse_iterator): Use
	conditional noexcept on constructors and assignment operators.
	* testsuite/24_iterators/reverse_iterator/noexcept.cc: New test.
2021-10-01 20:34:46 +01:00
Jonathan Wakely
681707ec28 libstdc++: Do not allocate a zero-size vector<bool> [PR 100153]
The vector<bool>::shrink_to_fit() implementation will allocate new
storage even if the vector is empty. That then leads to the
end-of-storage pointer being non-null and equal to the _M_start._M_p
pointer, which means that _M_end_addr() has undefined behaviour.

The fix is to stop doing a useless zero-sized allocation in
shrink_to_fit(), so that _M_start._M_p and _M_end_of_storage are both
null after an empty vector shrinks.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/100153
	* include/bits/vector.tcc (vector<bool>::_M_shrink_to_fit()):
	When size() is zero just deallocate and reset.
2021-10-01 20:34:46 +01:00
Jonathan Wakely
741c7350c0 libstdc++: Implement std::clamp with std::min and std::max [PR 96733]
The compiler doesn't know about the precondition of std::clamp that
(hi < lo) is false, and so can't optimize as well as we'd like. By using
std::min and std::max we help the compiler.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/96733
	* include/bits/stl_algo.h (clamp): Use std::min and std::max.
2021-10-01 20:34:46 +01:00
Jonathan Wakely
17374dab3e libstdc++: Define basic_regex::multiline for non-strict modes
The regex_constants::multiline constant is defined for non-strict C++11
and C++14 modes, on the basis that the feature is a DR (even though it
was really a new feature addition to C++17 and probably shouldn't have
gone through the issues list).

This makes the basic_regex::multiline constant defined consistently with
the regex_constants::multiline one.

For strict C++11 and C++14 mode we don't define them, because multiline
is not a reserved name in those standards.

libstdc++-v3/ChangeLog:

	* include/bits/regex.h (basic_regex::multiline): Define for
	non-strict C++11 and C++14 modes.
	* include/bits/regex_constants.h (regex_constants::multiline):
	Add _GLIBCXX_RESOLVE_LIB_DEFECTS comment.
2021-10-01 15:04:03 +01:00
Jonathan Wakely
94311bf347 libstdc++: Add missing header to test
We need to include <iterator> (or one of the containers) to get a
definition for std::begin.

libstdc++-v3/ChangeLog:

	* testsuite/25_algorithms/is_permutation/2.cc: Include <iterator>.
2021-10-01 15:04:02 +01:00
Jonathan Wakely
901fa4cc27 libstdc++: Add noexcept to istream_iterator and ostream_iterator
libstdc++-v3/ChangeLog:

	* include/bits/stream_iterator.h (istream_iterator): Add
	noexcept to constructors and non-throwing member functions and
	friend functions.
	(ostream_iterator): Likewise.
2021-10-01 15:04:02 +01:00
Jonathan Wakely
c67339d126 libstdc++: Fix _ForwardIteratorConcept for __gnu_debug::vector<bool>
The recent changes to the _GLIBCXX_CONCEPT_CHECKS checks for forward
iterators don't work for vector<bool> iterators in debug mode, because
the _Safe_iterator specializations don't match the special cases I added
for _Bit_iterator and _Bit_const_iterator.

This refactors the _ForwardIteratorReferenceConcept class template to
identify vector<bool> iterators using a new trait, which also works for
debug iterators.

libstdc++-v3/ChangeLog:

	* include/bits/boost_concept_check.h (_Is_vector_bool_iterator):
	New trait to identify vector<bool> iterators, including debug
	ones.
	(_ForwardIteratorReferenceConcept): Add default template
	argument using _Is_vector_bool_iterator and use it in partial
	specialization for the vector<bool> cases.
	(_Mutable_ForwardIteratorReferenceConcept): Likewise.
	* testsuite/24_iterators/operations/prev_neg.cc: Adjust dg-error
	line number.
2021-10-01 15:04:02 +01:00
Jonathan Wakely
b8d42cfa84 libstdc++: Replace try-catch in std::list::merge to avoid O(N) size
The current std::list::merge code calls size() before starting to merge
any elements, so that the _M_size members can be updated after the merge
finishes. The work is done in a try-block so that the sizes can still be
updated in an exception handler if any element comparison throws.

The _M_size members only exist for the cxx11 ABI, so the initial call to
size() and the try-catch are only needed for that ABI. For the old ABI
the size() call performs an O(N) list traversal to get a value that
isn't even used, and catching exceptions just to rethrow them isn't
needed either.

This refactors the merge functions to remove the try-catch block and use
an RAII type instead. For the cxx11 ABI that type's destructor updates
the list sizes, and for the old ABI it's a no-op.

libstdc++-v3/ChangeLog:

	* include/bits/list.tcc (list::merge): Remove call to size() and
	try-catch block. Use _Finalize_merge instead.
	* include/bits/stl_list.h (list::_Finalize_merge): New
	scope guard type to update _M_size members after a merge.
2021-10-01 15:04:02 +01:00
GCC Administrator
2467998373 Daily bump. 2021-10-01 00:16:27 +00:00
Jonathan Wakely
c5369961fa libstdc++: Fix preprocessor check for C++17
libstdc++-v3/ChangeLog:

	* include/bits/regex.h (basic_regex::multiline): Fix #if
	condition.
2021-09-30 09:00:22 +01:00
GCC Administrator
d238146e41 Daily bump. 2021-09-30 00:16:20 +00:00
Jonathan Wakely
f38cd3bdb4 libstdc++: Implement std::regex_constants::multiline (LWG 2503)
This implements LWG 2503, which allows ^ and $ to match line terminator
characters, rather than only matching the beginning and end of the
entire input. The multiline option is only valid for ECMAScript, but
for other grammars we ignore it rather than throwing an exception.

This is related to PR libstdc++/102480, which incorrectly said that
ECMAscript should match the beginning of a line when match_prev_avail
is used. I think that's only supposed to happen when multiline is used.

The new regex_constants::multiline and basic_regex::multiline constants
are not defined for strict -std=c++11 and -std=c++14 modes, but
regex_constants::__multiline is always defined, so that the
implementation can use it internally.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/regex.h (basic_regex::multiline): Define constant
	for C++17.
	* include/bits/regex_constants.h (regex_constants::multiline):
	Define constant for C++17.
	(regex_constants::__multiline): Define duplicate constant for
	internal use in C++11 and C++14.
	* include/bits/regex_executor.h (_Executor::_M_match_multiline()):
	New member function.
	(_Executor::_M_is_line_terminator(_CharT)): New member function.
	(_Executor::_M_at_begin(), _Executor::_M_at_end()): Use new
	member functions to support multiline matches.
	* testsuite/28_regex/algorithms/regex_match/multiline.cc: New test.
2021-09-29 13:48:19 +01:00
Jonathan Wakely
9ca4c42a3b libstdc++: Check for invalid syntax_option_type values in <regex>
The standard says that it is invalid for more than one grammar element
to be set in a value of type regex_constants::syntax_option_type. This
adds a check in the regex compiler andthrows an exception if an invalid
value is used.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/regex_compiler.h (_Compiler::_S_validate): New
	function.
	* include/bits/regex_compiler.tcc (_Compiler::_Compiler): Use
	_S_validate to check flags.
	* include/bits/regex_error.h (_S_grammar): New error code for
	internal use.
	* testsuite/28_regex/basic_regex/ctors/grammar.cc: New test.
2021-09-29 13:48:15 +01:00
Jonathan Wakely
b701e1f8f6 libstdc++: std::basic_regex should treat '\0' as an ordinary char [PR84110]
When the input sequence contains a _CharT(0) character, the strchr call
in _Scanner<_CharT>::_M_scan_normal() will search for '\0' and so return
a pointer to the terminating null at the end of the string. This makes
the scanner think it's found a special character. Because it doesn't
match any of the actual special characters, we fall off the end of the
function (or assert in debug mode).

We should check for a null character explicitly and either treat it as
an ordinary character (for the ECMAScript grammar) or an error (for all
others). I'm not 100% sure that's right, but it seems consistent with
the POSIX RE rules where a '\0' means the end of the regex pattern or
the end of the sequence being matched.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/84110
	* include/bits/regex_error.h (regex_constants::_S_null): New
	error code for internal use.
	* include/bits/regex_scanner.tcc (_Scanner::_M_scan_normal()):
	Check for null character.
	* testsuite/28_regex/basic_regex/84110.cc: New test.
2021-09-29 13:48:11 +01:00
Jonathan Wakely
b59be1adba libstdc++: Simplify std::basic_regex construction and assignment
Introduce a new _M_compile function which does the common work needed by
all constructors and assignment. Call that directly to avoid multiple
levels of constructor delegation or calls to basic_regex::assign
overloads.

For assignment, there is no need to construct a std::basic_string if we
already have a contiguous sequence of the correct character type, and no
need to construct a temporary basic_regex when assigning from an
existing basic_regex.

Also define the copy and move assignment operators as defaulted, which
does the right thing without constructing a temporary and swapping it.
Copying or moving the shared_ptr member cannot fail, so they can be
noexcept. The assign(const basic_regex&) and assign(basic_regex&&)
member can then be defined in terms of copy or move assignment.

The new _M_compile function takes pointer arguments, so the caller has
to convert arbitrary iterator ranges into a contiguous sequence of
characters. With that simplification, the __compile_nfa helpers are not
needed and can be removed.

This also fixes a bug where construction from a contiguous sequence with
the wrong character type would fail to compile, rather than converting
the elements to the regex character type.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/regex.h (__detail::__is_contiguous_iter): Move
	here from <bits/regex_compiler.h>.
	(basic_regex::_M_compile): New function to compile an NFA from
	a regular expression string.
	(basic_regex::basic_regex): Use _M_compile instead of delegating
	to other constructors.
	(basic_regex::operator=(const basic_regex&)): Define as
	defaulted.
	(basic_regex::operator=(initializer_list<C>)): Use _M_compile.
	(basic_regex::assign(const basic_regex&)): Use copy assignment.
	(basic_regex::assign(basic_regex&&)): Use move assignment.
	(basic_regex::assign(const C*, flag_type)): Use _M_compile
	instead of constructing a temporary string.
	(basic_regex::assign(const C*, size_t, flag_type)): Likewise.
	(basic_regex::assign(const basic_string<C,T,A>&, flag_type)):
	Use _M_compile instead of constructing a temporary basic_regex.
	(basic_regex::assign(InputIter, InputIter, flag_type)): Avoid
	constructing a temporary string for contiguous iterators of the
	right value type.
	* include/bits/regex_compiler.h (__is_contiguous_iter): Move to
	<bits/regex.h>.
	(__enable_if_contiguous_iter, __disable_if_contiguous_iter)
	(__compile_nfa): Remove.
	* testsuite/28_regex/basic_regex/assign/exception_safety.cc: New
	test.
	* testsuite/28_regex/basic_regex/ctors/char/other.cc: New test.
2021-09-29 13:48:02 +01:00
GCC Administrator
fd1334791e Daily bump. 2021-09-29 00:16:26 +00:00
Jonathan Wakely
2fcfc7d668 libstdc++: Fix return values for atomic wait on futex
This fixes a logic error in the futex-based timed wait.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/atomic_timed_wait.h (__platform_wait_until_impl):
	Return false for ETIMEDOUT and true otherwise.
2021-09-28 21:27:04 +01:00
François Dumont
26c09ae12d libstdc++: Fix 48631_neg test in _GLIBCXX_INLINE_VERSION mode
libstdc++-v3/ChangeLog:

	* testsuite/20_util/default_delete/48631_neg.cc: Adapt dg-prune-output message
	to also match message with '__8' in it.
2021-09-28 22:09:48 +02:00
Jonathan Wakely
c44c5f3d9f libstdc++: Remove obfuscating typedefs in <regex>
There is no benefit to using _SizeT instead of size_t, and IterT tells
you less about the type than const _CharT*. This removes some unhelpful
typedefs.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/bits/regex_automaton.h (_NFA_base::_SizeT): Remove.
	* include/bits/regex_compiler.h (_Compiler::_IterT): Remove.
	* include/bits/regex_compiler.tcc: Likewise.
	* include/bits/regex_scanner.h (_Scanner::_IterT): Remove.
	* include/bits/regex_scanner.tcc: Likewise.
2021-09-28 20:38:58 +01:00