aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2020-08-07 17:13:56 +0100
committerJonathan Wakely <jwakely@redhat.com>2020-08-17 15:27:51 +0100
commit91e6226f880b048275a7ceedef716e159c7cefd9 (patch)
treed5ffabee1f664bdd289651273cb5c7cfac81435d /libgfortran
parent929c4051afa22859831432d8feccfd1148ce7664 (diff)
downloadgcc-91e6226f880b048275a7ceedef716e159c7cefd9.zip
gcc-91e6226f880b048275a7ceedef716e159c7cefd9.tar.gz
gcc-91e6226f880b048275a7ceedef716e159c7cefd9.tar.bz2
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.
Diffstat (limited to 'libgfortran')
0 files changed, 0 insertions, 0 deletions