b7dbc6723a
Because uses-allocator construction is invariably done with a const lvalue the __uses_alloc helper should use a const lvalue for the is_constructible checks. Otherwise, it can detect that the type can be constructed from an rvalue, and then an error happens when a const lvalue is passed to the constructor instead. Prior to LWG DR 2586 scoped_allocator_adaptor incorrectly used an rvalue type in the is_constructible check and then used a non-const lvalue for the actual construction. The other components using uses-allocator construction (tuple and polymorphic_allocator) have always done so with a const lvalue allocator, although the use of __use_alloc in our implementation meant they behaved the same as scoped_allocator_adaptor and incorrectly used rvalues for the is_constructible checks. In C++20 the P0591R4 changes mean that all uses-allocator construction is defined in terms of the new uses_allocator_construction_args functions, which always use a const lvalue allocator. The changes in this patch ensure that the __use_alloc helper correctly matches the requirements in the standard, consistently using a const lvalue allocator for the is_constructible checks and the actual constructor arguments. * doc/xml/manual/intro.xml: Document LWG 2586 status. * include/bits/uses_allocator.h (__uses_alloc): Use const lvalue allocator type in is_constructible checks. * testsuite/20_util/scoped_allocator/69293_neg.cc: Adjust dg-error. * testsuite/20_util/scoped_allocator/dr2586.cc: New test. * testsuite/20_util/tuple/cons/allocators.cc: Add test using problematic type from LWG 2586 discussion. * testsuite/20_util/uses_allocator/69293_neg.cc: Adjust dg-error. * testsuite/20_util/uses_allocator/cons_neg.cc: Likewise. From-SVN: r268882 |
||
---|---|---|
.. | ||
apply | ||
comparison_operators | ||
cons | ||
creation_functions | ||
element_access | ||
make_from_tuple | ||
requirements | ||
48476.cc | ||
51365.cc | ||
53648.cc | ||
56785.cc | ||
60497.cc | ||
61947.cc | ||
67844.cc | ||
77395.cc | ||
77802.cc | ||
78939.cc | ||
cv_tuple_element.cc | ||
cv_tuple_size_neg.cc | ||
cv_tuple_size.cc | ||
dr2729.cc | ||
moveable2.cc | ||
moveable.cc | ||
noexcept_move_assign.cc | ||
noexcept_swap.cc | ||
swap_cxx17.cc | ||
swap.cc | ||
tuple_element_t.cc | ||
tuple_element.cc | ||
tuple_size_v.cc | ||
tuple_size.cc |