gcc/libstdc++-v3
Jonathan Wakely 462f6c2041 libstdc++: Workaround is_trivially_copyable<volatile T> (PR 94013)
Several algorithms check the is_trivially_copyable trait to decide
whether to dispatch to memmove or memcmp as an optimization. Since
r271435 (CWG DR 2094) the trait is true for volatile-qualified scalars,
but we can't use memmove or memcmp when the type is volatile. We need to
also check for volatile types.

This is complicated by the fact that in C++20 (but not earlier standards)
iterator_traits<volatile T*>::value_type is T, so we can't just check
whether the value_type is volatile.

The solution in this patch is to introduce new traits __memcpyable and
__memcmpable which combine into a single trait the checks for pointers,
the value types being the same, and the type being trivially copyable
but not volatile-qualified.

	PR libstdc++/94013
	* include/bits/cpp_type_traits.h (__memcpyable, __memcmpable): New
	traits to control when to use memmove and memcmp optimizations.
	(__is_nonvolatile_trivially_copyable): New helper trait.
	* include/bits/ranges_algo.h (__lexicographical_compare_fn): Do not
	use memcmp optimization with volatile data.
	* include/bits/ranges_algobase.h (__equal_fn): Use __memcmpable.
	(__copy_or_move, __copy_or_move_backward): Use __memcpyable.
	* include/bits/stl_algobase.h (__copy_move_a2): Use __memcpyable.
	(__copy_move_backward_a2): Likewise.
	(__equal_aux1): Use __memcmpable.
	(__lexicographical_compare_aux): Do not use memcmp optimization with
	volatile data.
	* testsuite/25_algorithms/copy/94013.cc: New test.
	* testsuite/25_algorithms/copy_backward/94013.cc: New test.
	* testsuite/25_algorithms/equal/94013.cc: New test.
	* testsuite/25_algorithms/fill/94013.cc: New test.
	* testsuite/25_algorithms/lexicographical_compare/94013.cc: New test.
	* testsuite/25_algorithms/move/94013.cc: New test.
	* testsuite/25_algorithms/move_backward/94013.cc: New test.
2020-03-03 21:39:19 +00:00
..
config x32: Update baseline_symbols.txt 2020-03-01 06:13:28 -08:00
doc Add `--with-toolexeclibdir=' configuration option 2020-01-24 11:24:25 +00:00
include libstdc++: Workaround is_trivially_copyable<volatile T> (PR 94013) 2020-03-03 21:39:19 +00:00
libsupc++ libstdc++: Remove std::type_info::operator!= for C++20 2020-02-20 11:30:19 +00:00
po Add `--with-toolexeclibdir=' configuration option 2020-01-24 11:24:25 +00:00
python libstdc++: Fix regression in libstdc++-prettyprinters/cxx20.cc 2020-02-17 13:20:57 +00:00
scripts Update copyright years. 2020-01-01 12:51:42 +01:00
src libstdc++ P1956R1 On the names of low-level bit manipulation functions 2020-02-17 17:09:18 +00:00
testsuite libstdc++: Workaround is_trivially_copyable<volatile T> (PR 94013) 2020-03-03 21:39:19 +00:00
acinclude.m4 libstdc++: Replace glibc-specific check for clock_gettime (PR 93325) 2020-01-28 13:24:09 +00:00
aclocal.m4 Add `--with-toolexeclibdir=' configuration option 2020-01-24 11:24:25 +00:00
ChangeLog libstdc++: Workaround is_trivially_copyable<volatile T> (PR 94013) 2020-03-03 21:39:19 +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 Update copyright years. 2019-01-01 13:31:55 +01:00
ChangeLog-2019 libstdc++: Fix whitespace in ChangeLog-2019 2020-01-09 21:31:35 +00:00
config.h.in libstdc++: Add full steady_clock support to shared_timed_mutex 2019-12-02 16:23:10 +00:00
configure Use a non-empty test program to test ability to link. 2020-02-12 13:22:07 -08:00
configure.ac libstdc++: Add full steady_clock support to shared_timed_mutex 2019-12-02 16:23:10 +00:00
configure.host [ARM/FDPIC v6 24/24] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in libstdc++ configure scripts 2019-09-10 10:13:20 +02:00
crossconfig.m4 reject macros in math decl check 2020-01-23 16:44:54 -03:00
fragment.am PR libstdc++/86450 use -Wabi=2 and simplify -Werror use 2018-07-17 14:18:47 +01:00
linkage.m4
Makefile.am Update copyright years. 2020-01-01 12:51:42 +01:00
Makefile.in Add `--with-toolexeclibdir=' configuration option 2020-01-24 11:24:25 +00:00
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.