From 4f3c75ba3a62d6f3794afd10d191807a68d7ba3b Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 24 Jul 2018 14:03:25 +0100 Subject: [PATCH] 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 --- libstdc++-v3/ChangeLog | 10 ++++++++++ libstdc++-v3/include/bits/uses_allocator.h | 6 +++++- .../testsuite/20_util/scoped_allocator/69293_neg.cc | 2 +- .../testsuite/20_util/uses_allocator/69293_neg.cc | 2 +- .../testsuite/20_util/uses_allocator/cons_neg.cc | 2 +- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ede29a49749..dc8dfdac7fd 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,15 @@ 2018-07-24 Jonathan Wakely + * 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 whitespace. (__resource_adaptor_imp): Add second template parameter for type of diff --git a/libstdc++-v3/include/bits/uses_allocator.h b/libstdc++-v3/include/bits/uses_allocator.h index 820a2a59894..3ef2830bebc 100644 --- a/libstdc++-v3/include/bits/uses_allocator.h +++ b/libstdc++-v3/include/bits/uses_allocator.h @@ -36,11 +36,15 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION + // This is used for std::experimental::erased_type from Library Fundamentals. 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 using __is_erased_or_convertible - = __or_, is_convertible<_Alloc, _Tp>>; + = __or_, is_same<_Tp, __erased_type>>; /// [allocator.tag] struct allocator_arg_t { explicit allocator_arg_t() = default; }; diff --git a/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc b/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc index 621ff47c7a3..168079fd5f9 100644 --- a/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc +++ b/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc @@ -46,5 +46,5 @@ test01() scoped_alloc sa; auto p = sa.allocate(1); sa.construct(p); // this is required to be ill-formed - // { dg-error "static assertion failed" "" { target *-*-* } 90 } + // { dg-error "static assertion failed" "" { target *-*-* } 94 } } diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc index 348ed41a7bc..eaf432491c6 100644 --- a/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc @@ -44,5 +44,5 @@ test01() { alloc_type a; std::tuple 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 } } diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc index 8894e389cec..bb8c38d1e49 100644 --- a/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc @@ -43,4 +43,4 @@ void test01() tuple t(allocator_arg, a, 1); } -// { dg-error "static assertion failed" "" { target *-*-* } 90 } +// { dg-error "static assertion failed" "" { target *-*-* } 94 } -- 2.30.2