]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: Remove inheritance from elements in std::tuple
authorJonathan Wakely <jwakely@redhat.com>
Fri, 7 Aug 2020 16:13:56 +0000 (17:13 +0100)
committerGiuliano Belinassi <giuliano.belinassi@usp.br>
Mon, 17 Aug 2020 18:08:17 +0000 (15:08 -0300)
commitfcbca3c166d91dac355ff6e917a9c39c7c62bb56
tree2cfae7de90bf56016f87b074b14b9b5fee8c3d82
parent5cd12fbfd32ac7b40a901942471d52d22de81c36
libstdc++: Remove inheritance from elements in std::tuple

This fixes a number of std::tuple bugs by no longer making use of the
empty base-class optimization. By using the C++20 [[no_unique_address]]
attribute we can always store the element as a data member, while still
compressing the layout of tuples containing empty types.

Since we no longer use inheritance we could also apply the compression
optimization for final types and for tuples of tuples, but doing so
would be an ABI break.

Using [[no_unique_address]] more liberally for the unstable std::__8
configuration is left for a later date. There may be reasons not to
apply the attribute unconditionally, e.g. see the discussion about
guaranteed elision in PR 94062.

libstdc++-v3/ChangeLog:

PR libstdc++/55713
PR libstdc++/71096
PR libstdc++/93147
* include/std/tuple [__has_cpp_attribute(no_unique_address)]
(_Head_base<Idx, Head, true>): New definition of the partial
specialization, using [[no_unique_address]] instead of
inheritance.
* testsuite/libstdc++-prettyprinters/48362.cc: Adjust expected
output.
* testsuite/20_util/tuple/comparison_operators/93147.cc: New test.
* testsuite/20_util/tuple/creation_functions/55713.cc: New test.
* testsuite/20_util/tuple/element_access/71096.cc: New test.
libstdc++-v3/include/std/tuple
libstdc++-v3/testsuite/20_util/tuple/comparison_operators/93147.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/tuple/creation_functions/55713.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/tuple/element_access/71096.cc [new file with mode: 0644]
libstdc++-v3/testsuite/libstdc++-prettyprinters/48362.cc