gcc/libstdc++-v3
Jonathan Wakely 2f983fa690 libstdc++: Fix three-way comparison for std::array [PR 96851]
The spaceship operator for std::array uses memcmp when the
__is_byte<value_type> trait is true, but memcmp isn't usable in
constexpr contexts. Also, memcmp should only be used for unsigned byte
types, because it gives the wrong answer for signed chars with negative
values.

We can simply check std::is_constant_evaluated() so that we don't use
memcmp during constant evaluation.

To fix the problem of using memcmp for inappropriate types, this patch
adds new __is_memcmp_ordered and __is_memcmp_ordered_with traits. These
say whether using memcmp will give the right answer for ordering
operations such as lexicographical_compare and three-way comparisons.
The new traits can be used in several places, and can also be used to
implement my suggestion in PR 93059 comment 37 to use memcmp for
unsigned integers larger than one byte on big endian targets.

libstdc++-v3/ChangeLog:

	PR libstdc++/96851
	* include/bits/cpp_type_traits.h (__is_memcmp_ordered):
	New trait that says if memcmp can be used for ordering.
	(__is_memcmp_ordered_with): Likewise, for two types.
	* include/bits/deque.tcc (__lex_cmp_dit): Use new traits
	instead of __is_byte and __numeric_traits.
	(__lexicographical_compare_aux1): Likewise.
	* include/bits/ranges_algo.h (__lexicographical_compare_fn):
	Likewise.
	* include/bits/stl_algobase.h (__lexicographical_compare_aux1)
	(__is_byte_iter): Likewise.
	* include/std/array (operator<=>): Likewise. Only use memcmp
	when std::is_constant_evaluated() is false.
	* testsuite/23_containers/array/comparison_operators/96851.cc:
	New test.
	* testsuite/23_containers/array/tuple_interface/get_neg.cc:
	Adjust dg-error line numbers.
2020-09-02 15:32:11 +01:00
..
config aix: Support libsupc++ as a FAT library 2020-08-18 16:55:10 -04:00
doc libstdc++: Implement P0966 std::string::reserve should not shrink 2020-08-06 19:49:07 +01:00
include libstdc++: Fix three-way comparison for std::array [PR 96851] 2020-09-02 15:32:11 +01:00
libsupc++ libstdc++: Break header cycle between <new> and <exception> 2020-09-02 13:56:32 +01:00
po libstdc++: Regenerate makefiles 2020-06-23 07:59:40 +01:00
python libstdc++: Fix compatibility support in unique_ptr pretty printer 2020-08-10 18:47:06 +01:00
scripts Update copyright years. 2020-01-01 12:51:42 +01:00
src libstdc++: Make std::this_thread functions work without gthreads 2020-08-11 16:16:21 +01:00
testsuite libstdc++: Fix three-way comparison for std::array [PR 96851] 2020-09-02 15:32:11 +01:00
acinclude.m4 libstdc++: Deprecate the --enable-cheaders=c_std configuration 2020-08-13 16:33:28 +01:00
aclocal.m4 Add `--with-toolexeclibdir=' configuration option 2020-01-24 11:24:25 +00:00
ChangeLog Daily bump. 2020-09-02 00:16:25 +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 std::from_chars for floating-point types 2020-07-20 23:49:27 +01:00
configure libstdc++: Deprecate the --enable-cheaders=c_std configuration 2020-08-13 16:33:28 +01:00
configure.ac libstdc++: Add std::from_chars for floating-point types 2020-07-20 23:49:27 +01:00
configure.host aix: Add GCC64 configuration and FAT target libraries. 2020-06-21 14:14:46 -04:00
crossconfig.m4 libstdc++: Add std::from_chars for floating-point types 2020-07-20 23:49:27 +01:00
fragment.am
linkage.m4
Makefile.am build: Use -include instead of conditional include. 2020-06-22 21:31:48 +00:00
Makefile.in build: Use -include instead of conditional include. 2020-06-22 21:31:48 +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.