libstdc++: Remove inheritance from elements in std::tuple
authorJonathan Wakely <jwakely@redhat.com>
Fri, 7 Aug 2020 16:13:56 +0000 (17:13 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 17 Aug 2020 14:27:51 +0000 (15:27 +0100)
commit91e6226f880b048275a7ceedef716e159c7cefd9
treed5ffabee1f664bdd289651273cb5c7cfac81435d
parent929c4051afa22859831432d8feccfd1148ce7664
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