DR 2586 fix value category in uses-allocator checks
authorJonathan Wakely <jwakely@redhat.com>
Thu, 14 Feb 2019 15:08:33 +0000 (15:08 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 14 Feb 2019 15:08:33 +0000 (15:08 +0000)
commitb7dbc6723a622c22140206005bfb1eb9ac7593f9
treea6f827ea26d8782bc9139e813dfb2fc55e163674
parent6461bdc48fa3f98015584953598a83f8c7caa506
DR 2586 fix value category in uses-allocator checks

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
libstdc++-v3/ChangeLog
libstdc++-v3/doc/xml/manual/intro.xml
libstdc++-v3/include/bits/uses_allocator.h
libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc
libstdc++-v3/testsuite/20_util/scoped_allocator/dr2586.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/tuple/cons/allocators.cc
libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc
libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc