gcc/libstdc++-v3/testsuite/20_util
Jonathan Wakely aaeac1568d P0357R3 reference_wrapper for incomplete types
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
2019-01-11 23:41:11 +00:00
..
add_const Update copyright years. 2019-01-01 13:31:55 +01:00
add_cv Update copyright years. 2019-01-01 13:31:55 +01:00
add_lvalue_reference Update copyright years. 2019-01-01 13:31:55 +01:00
add_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
add_rvalue_reference Update copyright years. 2019-01-01 13:31:55 +01:00
add_volatile Update copyright years. 2019-01-01 13:31:55 +01:00
addressof Update copyright years. 2019-01-01 13:31:55 +01:00
align Update copyright years. 2019-01-01 13:31:55 +01:00
aligned_storage Update copyright years. 2019-01-01 13:31:55 +01:00
aligned_union Update copyright years. 2019-01-01 13:31:55 +01:00
alignment_of Update copyright years. 2019-01-01 13:31:55 +01:00
allocator Update copyright years. 2019-01-01 13:31:55 +01:00
allocator_traits Update copyright years. 2019-01-01 13:31:55 +01:00
any Update copyright years. 2019-01-01 13:31:55 +01:00
as_const Update copyright years. 2019-01-01 13:31:55 +01:00
assume_aligned Update copyright years. 2019-01-01 13:31:55 +01:00
auto_ptr Update copyright years. 2019-01-01 13:31:55 +01:00
bad_function_call Update copyright years. 2019-01-01 13:31:55 +01:00
bind Update copyright years. 2019-01-01 13:31:55 +01:00
bool_constant Update copyright years. 2019-01-01 13:31:55 +01:00
common_type/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
conditional/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
decay/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
declval/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
default_delete Update copyright years. 2019-01-01 13:31:55 +01:00
duration P0972R0 <chrono> zero(), min(), and max() should be noexcept 2019-01-11 23:41:05 +00:00
duration_cast Update copyright years. 2019-01-01 13:31:55 +01:00
enable_if/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
enable_shared_from_this Update copyright years. 2019-01-01 13:31:55 +01:00
endian Update copyright years. 2019-01-01 13:31:55 +01:00
exchange Update copyright years. 2019-01-01 13:31:55 +01:00
extent Update copyright years. 2019-01-01 13:31:55 +01:00
forward Update copyright years. 2019-01-01 13:31:55 +01:00
from_chars Update copyright years. 2019-01-01 13:31:55 +01:00
function Update copyright years. 2019-01-01 13:31:55 +01:00
function_objects Update copyright years. 2019-01-01 13:31:55 +01:00
has_unique_object_representations Update copyright years. 2019-01-01 13:31:55 +01:00
has_virtual_destructor Update copyright years. 2019-01-01 13:31:55 +01:00
hash PR libstdc++/88802 define std::hash<nullptr_t> for C++17 2019-01-11 14:54:49 +00:00
headers Update copyright years. 2019-01-01 13:31:55 +01:00
in_place Update copyright years. 2019-01-01 13:31:55 +01:00
integer_sequence Update copyright years. 2019-01-01 13:31:55 +01:00
integral_constant Update copyright years. 2019-01-01 13:31:55 +01:00
is_abstract Update copyright years. 2019-01-01 13:31:55 +01:00
is_aggregate Update copyright years. 2019-01-01 13:31:55 +01:00
is_arithmetic Update copyright years. 2019-01-01 13:31:55 +01:00
is_array Update copyright years. 2019-01-01 13:31:55 +01:00
is_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_base_of Update copyright years. 2019-01-01 13:31:55 +01:00
is_class Update copyright years. 2019-01-01 13:31:55 +01:00
is_compound Update copyright years. 2019-01-01 13:31:55 +01:00
is_const Update copyright years. 2019-01-01 13:31:55 +01:00
is_constant_evaluated Update copyright years. 2019-01-01 13:31:55 +01:00
is_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_convertible Update copyright years. 2019-01-01 13:31:55 +01:00
is_copy_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_copy_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_default_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_destructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_empty Update copyright years. 2019-01-01 13:31:55 +01:00
is_enum Update copyright years. 2019-01-01 13:31:55 +01:00
is_final Update copyright years. 2019-01-01 13:31:55 +01:00
is_floating_point Update copyright years. 2019-01-01 13:31:55 +01:00
is_function Update copyright years. 2019-01-01 13:31:55 +01:00
is_fundamental Update copyright years. 2019-01-01 13:31:55 +01:00
is_implicitly_default_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_integral Update copyright years. 2019-01-01 13:31:55 +01:00
is_invocable Update copyright years. 2019-01-01 13:31:55 +01:00
is_literal_type Update copyright years. 2019-01-01 13:31:55 +01:00
is_lvalue_reference Update copyright years. 2019-01-01 13:31:55 +01:00
is_member_function_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_member_object_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_member_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_move_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_move_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_convertible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_copy_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_copy_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_default_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_destructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_invocable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_move_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_move_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_swappable Update copyright years. 2019-01-01 13:31:55 +01:00
is_nothrow_swappable_with Update copyright years. 2019-01-01 13:31:55 +01:00
is_null_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_object Update copyright years. 2019-01-01 13:31:55 +01:00
is_pod Update copyright years. 2019-01-01 13:31:55 +01:00
is_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
is_polymorphic Update copyright years. 2019-01-01 13:31:55 +01:00
is_reference Update copyright years. 2019-01-01 13:31:55 +01:00
is_rvalue_reference Update copyright years. 2019-01-01 13:31:55 +01:00
is_same Update copyright years. 2019-01-01 13:31:55 +01:00
is_scalar Update copyright years. 2019-01-01 13:31:55 +01:00
is_signed Update copyright years. 2019-01-01 13:31:55 +01:00
is_standard_layout Update copyright years. 2019-01-01 13:31:55 +01:00
is_swappable Update copyright years. 2019-01-01 13:31:55 +01:00
is_swappable_with Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivial Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_copy_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_copy_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_copyable Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_default_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_destructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_move_assignable Update copyright years. 2019-01-01 13:31:55 +01:00
is_trivially_move_constructible Update copyright years. 2019-01-01 13:31:55 +01:00
is_union Update copyright years. 2019-01-01 13:31:55 +01:00
is_unsigned Update copyright years. 2019-01-01 13:31:55 +01:00
is_void Update copyright years. 2019-01-01 13:31:55 +01:00
is_volatile Update copyright years. 2019-01-01 13:31:55 +01:00
logical_traits Update copyright years. 2019-01-01 13:31:55 +01:00
make_signed/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
make_unsigned/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
memory_resource Update copyright years. 2019-01-01 13:31:55 +01:00
monotonic_buffer_resource Update copyright years. 2019-01-01 13:31:55 +01:00
move Update copyright years. 2019-01-01 13:31:55 +01:00
move_if_noexcept Update copyright years. 2019-01-01 13:31:55 +01:00
optional Update copyright years. 2019-01-01 13:31:55 +01:00
owner_less Update copyright years. 2019-01-01 13:31:55 +01:00
pair Update copyright years. 2019-01-01 13:31:55 +01:00
pointer_safety Update copyright years. 2019-01-01 13:31:55 +01:00
pointer_traits Update copyright years. 2019-01-01 13:31:55 +01:00
polymorphic_allocator Update copyright years. 2019-01-01 13:31:55 +01:00
rank Update copyright years. 2019-01-01 13:31:55 +01:00
ratio Update copyright years. 2019-01-01 13:31:55 +01:00
raw_storage_iterator Update copyright years. 2019-01-01 13:31:55 +01:00
reference_wrapper P0357R3 reference_wrapper for incomplete types 2019-01-11 23:41:11 +00:00
remove_all_extents Update copyright years. 2019-01-01 13:31:55 +01:00
remove_const Update copyright years. 2019-01-01 13:31:55 +01:00
remove_cv Update copyright years. 2019-01-01 13:31:55 +01:00
remove_cvref Update copyright years. 2019-01-01 13:31:55 +01:00
remove_extent Update copyright years. 2019-01-01 13:31:55 +01:00
remove_pointer Update copyright years. 2019-01-01 13:31:55 +01:00
remove_reference Update copyright years. 2019-01-01 13:31:55 +01:00
remove_volatile Update copyright years. 2019-01-01 13:31:55 +01:00
result_of Update copyright years. 2019-01-01 13:31:55 +01:00
scoped_allocator Update copyright years. 2019-01-01 13:31:55 +01:00
shared_ptr Update copyright years. 2019-01-01 13:31:55 +01:00
specialized_algorithms Update copyright years. 2019-01-01 13:31:55 +01:00
steady_clock Update copyright years. 2019-01-01 13:31:55 +01:00
synchronized_pool_resource Update copyright years. 2019-01-01 13:31:55 +01:00
system_clock Update copyright years. 2019-01-01 13:31:55 +01:00
time_point P0972R0 <chrono> zero(), min(), and max() should be noexcept 2019-01-11 23:41:05 +00:00
time_point_cast Update copyright years. 2019-01-01 13:31:55 +01:00
to_address Update copyright years. 2019-01-01 13:31:55 +01:00
to_chars Update copyright years. 2019-01-01 13:31:55 +01:00
tuple Update copyright years. 2019-01-01 13:31:55 +01:00
type_identity/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
typeindex Update copyright years. 2019-01-01 13:31:55 +01:00
underlying_type/requirements Update copyright years. 2019-01-01 13:31:55 +01:00
unique_ptr Update copyright years. 2019-01-01 13:31:55 +01:00
unsynchronized_pool_resource Update copyright years. 2019-01-01 13:31:55 +01:00
unwrap_reference Update copyright years. 2019-01-01 13:31:55 +01:00
uses_allocator Update copyright years. 2019-01-01 13:31:55 +01:00
variant PR libstdc++/87431 fix regression introduced by r264574 2019-01-06 20:52:34 +00:00
void_t Update copyright years. 2019-01-01 13:31:55 +01:00
weak_ptr Update copyright years. 2019-01-01 13:31:55 +01:00
rel_ops.cc Update copyright years. 2019-01-01 13:31:55 +01:00
temporary_buffer.cc Update copyright years. 2019-01-01 13:31:55 +01:00
variable_templates_for_traits.cc Update copyright years. 2019-01-01 13:31:55 +01:00