mirror of git://gcc.gnu.org/git/gcc.git
This patch implements the C++2a proposal to allow incomplete types in std::reference_wrapper, which was previously undefined. The change cannot be implemented for earlier standards, because prior to C++2a std::reference_wrapper has a weak result type, so must inspect the template argument to see if it defines a nested result_type member. That is deprecated (but still required) in C++17, and removed from C++2a. The removal of the base class from reference_wrapper is a potential ABI change, as it could alter the layout of a type which derives from reference_wrapper<T> and from an empty type with _Weak_result_type<T> as a base class. Previously the repeated _Weak_result_type<T> base class would have prevented the empty base-class optimization, but if reference_wrapper<T> no longer derives from it, the empty class could be placed at the same address as the reference_wrapper<T> base. In practice, the only types which derive from _Weak_result_type or from _Reference_wrapper_base_memfun or any of its base classes are non-empty types defined in libstdc++: std::reference_wrapper, std::function, and std::_Bind. As they are non-empty types, they are not eligible for EBO anyway. * include/bits/refwrap.h [__cplusplus > 201703L] (_Refwrap_base_arg1, _Refwrap_base_arg2, _Reference_wrapper_base) (_Reference_wrapper_base_memfun): Do not define for C++2a. (reference_wrapper): Do not derive from _Reference_wrapper_base_memfun for C++2a. (reference_wrapper::operator()): Add static assertion. * testsuite/20_util/reference_wrapper/incomplete.cc: New test. From-SVN: r267866 |
||
|---|---|---|
| .. | ||
| 17_intro | ||
| 18_support | ||
| 19_diagnostics | ||
| 20_util | ||
| 21_strings | ||
| 22_locale | ||
| 23_containers | ||
| 24_iterators | ||
| 25_algorithms | ||
| 26_numerics | ||
| 27_io | ||
| 28_regex | ||
| 29_atomics | ||
| 30_threads | ||
| abi | ||
| backward | ||
| config | ||
| data | ||
| decimal | ||
| experimental | ||
| ext | ||
| lib | ||
| libstdc++-abi | ||
| libstdc++-dg | ||
| libstdc++-prettyprinters | ||
| libstdc++-xmethods | ||
| performance | ||
| special_functions | ||
| tr1 | ||
| tr2 | ||
| util | ||
| Makefile.am | ||
| Makefile.in | ||