Reorder conditions in uses-allocator construction helper

The erased_type condition is only true for code using the Library
Fundamentals TS, so assume it's less common and only check it after
checking for convertibility.

This does mean for types using erased_type the more expensive
convertibility check is done first, but such types are rare.

	* include/bits/uses_allocator.h (__is_erased_or_convertible): Reorder
	conditions. Add comments.
	* testsuite/20_util/uses_allocator/69293_neg.cc: Adjust dg-error line.
	* testsuite/20_util/uses_allocator/cons_neg.cc: Likewise.
	* testsuite/20_util/scoped_allocator/69293_neg.cc: Likewise.

From-SVN: r262945
This commit is contained in:
Jonathan Wakely 2018-07-24 14:03:25 +01:00 committed by Jonathan Wakely
parent 7a4be38049
commit 4f3c75ba3a
5 changed files with 18 additions and 4 deletions

View File

@ -1,5 +1,15 @@
2018-07-24 Jonathan Wakely <jwakely@redhat.com> 2018-07-24 Jonathan Wakely <jwakely@redhat.com>
* include/bits/uses_allocator.h (__is_erased_or_convertible): Reorder
conditions. Add comments.
* testsuite/20_util/uses_allocator/69293_neg.cc: Adjust dg-error line.
* testsuite/20_util/uses_allocator/cons_neg.cc: Likewise.
* testsuite/20_util/scoped_allocator/69293_neg.cc: Likewise.
* include/bits/uses_allocator.h (__is_erased_or_convertible): Remove.
(__uses_allocator_helper): Check conditions directly instead of
using __is_erased_or_convertible.
* include/experimental/memory_resource: Adjust comments and * include/experimental/memory_resource: Adjust comments and
whitespace. whitespace.
(__resource_adaptor_imp): Add second template parameter for type of (__resource_adaptor_imp): Add second template parameter for type of

View File

@ -36,11 +36,15 @@ namespace std _GLIBCXX_VISIBILITY(default)
{ {
_GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_BEGIN_NAMESPACE_VERSION
// This is used for std::experimental::erased_type from Library Fundamentals.
struct __erased_type { }; struct __erased_type { };
// This also supports the "type-erased allocator" protocol from the
// Library Fundamentals TS, where allocator_type is erased_type.
// The second condition will always be false for types not using the TS.
template<typename _Alloc, typename _Tp> template<typename _Alloc, typename _Tp>
using __is_erased_or_convertible using __is_erased_or_convertible
= __or_<is_same<_Tp, __erased_type>, is_convertible<_Alloc, _Tp>>; = __or_<is_convertible<_Alloc, _Tp>, is_same<_Tp, __erased_type>>;
/// [allocator.tag] /// [allocator.tag]
struct allocator_arg_t { explicit allocator_arg_t() = default; }; struct allocator_arg_t { explicit allocator_arg_t() = default; };

View File

@ -46,5 +46,5 @@ test01()
scoped_alloc sa; scoped_alloc sa;
auto p = sa.allocate(1); auto p = sa.allocate(1);
sa.construct(p); // this is required to be ill-formed sa.construct(p); // this is required to be ill-formed
// { dg-error "static assertion failed" "" { target *-*-* } 90 } // { dg-error "static assertion failed" "" { target *-*-* } 94 }
} }

View File

@ -44,5 +44,5 @@ test01()
{ {
alloc_type a; alloc_type a;
std::tuple<X> t(std::allocator_arg, a); // this is required to be ill-formed std::tuple<X> t(std::allocator_arg, a); // this is required to be ill-formed
// { dg-error "static assertion failed" "" { target *-*-* } 90 } // { dg-error "static assertion failed" "" { target *-*-* } 94 }
} }

View File

@ -43,4 +43,4 @@ void test01()
tuple<Type> t(allocator_arg, a, 1); tuple<Type> t(allocator_arg, a, 1);
} }
// { dg-error "static assertion failed" "" { target *-*-* } 90 } // { dg-error "static assertion failed" "" { target *-*-* } 94 }