gcc/libstdc++-v3
Jonathan Wakely 258bd1d63a PR libstdc++/89130 restore support for non-MoveConstructible types
The changes to "relocate" std::vector elements can lead to new errors
outside the immediate context, because moving the elements to new
storage no longer makes use of the move-if-noexcept utilities. This
means that types with deleted moves no longer degenerate to copies, but
are just ill-formed. The errors happen while instantiating the
noexcept-specifier for __relocate_object_a, when deciding whether to try
to relocate.

This patch introduces indirections to avoid the ill-formed
instantiations of std::__relocate_object_a. In order to avoid using
if-constexpr prior to C++17 this is done by tag dispatching. After this
patch all uses of std::__relocate_a are guarded by checks that will
support sensible code (i.e. code not using custom allocators that fool
the new checks).

	PR libstdc++/89130
	* include/bits/alloc_traits.h (__is_copy_insertable_impl): Rename to
	__is_alloc_insertable_impl. Replace single type member with two
	members, one for each of copy and move insertable.
	(__is_move_insertable): New trait for internal use.
	* include/bits/stl_vector.h (vector::_S_nothrow_relocate(true_type))
	(vector::_S_nothrow_relocate(true_type)): New functions to
	conditionally check if __relocate_a can throw.
	(vector::_S_use_relocate()): Dispatch to _S_nothrow_relocate based
	on __is_move_insertable.
	(vector::_S_do_relocate): New overloaded functions to conditionally
	call __relocate_a.
	(vector::_S_relocate): New function that dispatches to _S_do_relocate
	based on _S_use_relocate.
	* include/bits/vector.tcc (vector::reserve, vector::_M_realloc_insert)
	(vector::_M_default_append): Call _S_relocate instead of __relocate_a.
	* testsuite/23_containers/vector/modifiers/push_back/89130.cc: New.

From-SVN: r268537
2019-02-05 14:45:00 +00:00
..
config Add missing exports for symbols used by directory iterators 2019-01-29 00:47:43 +00:00
doc * doc/xml/manual/status_cxx2020.xml: Update P0600 entry. 2019-01-30 16:23:44 +00:00
include PR libstdc++/89130 restore support for non-MoveConstructible types 2019-02-05 14:45:00 +00:00
libsupc++ Fix after P0600. 2019-01-21 11:47:30 +00:00
po
python PR libstdc++/87855 fix optional for types with non-trivial copy/move 2019-01-08 23:00:46 +00:00
scripts
src PR libstdc++/89117 fix path::replace_extension("") case 2019-01-30 23:18:22 +00:00
testsuite PR libstdc++/89130 restore support for non-MoveConstructible types 2019-02-05 14:45:00 +00:00
acinclude.m4 Fix build for systems without POSIX truncate 2019-01-07 12:38:51 +00:00
aclocal.m4
ChangeLog PR libstdc++/89130 restore support for non-MoveConstructible types 2019-02-05 14:45:00 +00:00
ChangeLog-1998
ChangeLog-1999
ChangeLog-2000
ChangeLog-2001
ChangeLog-2002
ChangeLog-2003
ChangeLog-2004
ChangeLog-2005
ChangeLog-2006
ChangeLog-2007
ChangeLog-2008
ChangeLog-2009
ChangeLog-2010
ChangeLog-2011
ChangeLog-2012
ChangeLog-2013
ChangeLog-2014
ChangeLog-2015
ChangeLog-2016
ChangeLog-2017
ChangeLog-2018
config.h.in Fix build for systems without POSIX truncate 2019-01-07 12:38:51 +00:00
configure Fix build for systems without POSIX truncate 2019-01-07 12:38:51 +00:00
configure.ac
configure.host
crossconfig.m4
fragment.am
linkage.m4
Makefile.am
Makefile.in
README

file: libstdc++-v3/README

New users may wish to point their web browsers to the file
index.html in the 'doc/html' subdirectory.  It contains brief
building instructions and notes on how to configure the library in
interesting ways.