diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ede29a497497..dc8dfdac7fdd 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 820a2a598942..3ef2830bebc1 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 621ff47c7a36..168079fd5f93 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 348ed41a7bce..eaf432491c67 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 8894e389cec7..bb8c38d1e49a 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 }