From: Jonathan Wakely Date: Fri, 26 Apr 2019 13:15:54 +0000 (+0100) Subject: Tweak C++2a uses-allocator construction utilities X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3addb7b937c614101cd3bb7a7e91cd3fc84d30b5;p=gcc.git Tweak C++2a uses-allocator construction utilities The 20_util/scoped_allocator/69293_neg.cc test was failing in C++2a mode because the expected static_assert text wasn't matched. The code is still ill-formed in C++2a, but uses the new __uses_alloc_args function and so fails a different static_assert. This patch adds the same string to the new static_assert, so the test passes. Now that G++ allows concepts to be declared without 'bool' we can use the correct C++2a syntax for the _Std_pair concept used to constrain the uses-allocator construction utilities. Also add a new test to verify that pmr::polymorphic_allocator correctly performs recursive uses-allocator construction for nested pairs in C++2a. * include/std/memory (__uses_alloc_args): Add string-literal to static_assert, to match the one in __uses_alloc. [__cpp_concepts] (_Std_pair): Use C++2a syntax for concept. * testsuite/20_util/polymorphic_allocator/construct_c++2a.cc: Check for recursive uses-allocator construction of nested pairs. * testsuite/20_util/scoped_allocator/construct_pair_c++2a.cc:: Add comment. From-SVN: r270600 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5c524812664..d2f8ed4f1aa 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2019-04-26 Jonathan Wakely + + * include/std/memory (__uses_alloc_args): Add string-literal to + static_assert, to match the one in __uses_alloc. + [__cpp_concepts] (_Std_pair): Use C++2a syntax for concept. + * testsuite/20_util/polymorphic_allocator/construct_c++2a.cc: Check + for recursive uses-allocator construction of nested pairs. + * testsuite/20_util/scoped_allocator/construct_pair_c++2a.cc:: Add + comment. + 2019-04-26 Jakub Jelinek * config/abi/post/s390x-linux-gnu/32/baseline_symbols.txt: Update. diff --git a/libstdc++-v3/include/std/memory b/libstdc++-v3/include/std/memory index 57ccf93de86..6677fe782de 100644 --- a/libstdc++-v3/include/std/memory +++ b/libstdc++-v3/include/std/memory @@ -191,7 +191,9 @@ get_pointer_safety() noexcept { return pointer_safety::relaxed; } } else { - static_assert(is_constructible_v<_Tp, _Args..., const _Alloc&>); + static_assert(is_constructible_v<_Tp, _Args..., const _Alloc&>, + "construction with an allocator must be possible" + " if uses_allocator is true"); return tuple<_Args&&..., const _Alloc&>( std::forward<_Args>(__args)..., __a); @@ -207,7 +209,7 @@ get_pointer_safety() noexcept { return pointer_safety::relaxed; } #if __cpp_concepts template - concept bool _Std_pair = __is_pair<_Tp>::value; + concept _Std_pair = __is_pair<_Tp>::value; #endif // This is a temporary workaround until -fconcepts is implied by -std=gnu++2a diff --git a/libstdc++-v3/testsuite/20_util/polymorphic_allocator/construct_c++2a.cc b/libstdc++-v3/testsuite/20_util/polymorphic_allocator/construct_c++2a.cc index 9048ca196ff..df01dccafe1 100644 --- a/libstdc++-v3/testsuite/20_util/polymorphic_allocator/construct_c++2a.cc +++ b/libstdc++-v3/testsuite/20_util/polymorphic_allocator/construct_c++2a.cc @@ -21,6 +21,8 @@ #include #include #include +#include +#include struct do_not_copy { do_not_copy() = default; @@ -115,6 +117,54 @@ test05() a.deallocate(ptr, 1); } +// P0591R4 makes uses-allocator construction apply recursively for nested pairs +void +test06() +{ + struct X + { + using allocator_type = std::pmr::polymorphic_allocator; + X() = default; + X(const X&) { throw 1; } + X(const X&, const allocator_type& a) : mr(a.resource()) { } + + std::pmr::memory_resource* mr = nullptr; + }; + + struct Y + { + using allocator_type = std::pmr::polymorphic_allocator; + Y() = default; + Y(const Y&) = delete; + Y(std::allocator_arg_t, const allocator_type& a, const Y&) + : mr(a.resource()) { } + + std::pmr::memory_resource* mr = nullptr; + }; + + using value_type = std::pair, std::pair>; + __gnu_test::memory_resource mr; + std::pmr::polymorphic_allocator a(&mr); + std::pmr::vector v(a); + VERIFY( v.get_allocator().resource() == &mr ); + + value_type val; + val.first.second = 2; + val.second.first = 3; + v.push_back(val); + X& x = v.back().first.first; + VERIFY( x.mr != val.first.first.mr ); + VERIFY( x.mr == &mr ); + + Y& y = v.back().second.second; + VERIFY( y.mr != val.second.second.mr ); + VERIFY( y.mr == &mr ); + + // Check other members of the pairs are correctly initialized too: + VERIFY( v.back().first.second == val.first.second ); + VERIFY( v.back().second.first == val.second.first ); +} + int main() { test01(); @@ -122,4 +172,5 @@ int main() test03(); test04(); test05(); + test06(); } diff --git a/libstdc++-v3/testsuite/20_util/scoped_allocator/construct_pair_c++2a.cc b/libstdc++-v3/testsuite/20_util/scoped_allocator/construct_pair_c++2a.cc index 1630f2a4d09..09050b2bc08 100644 --- a/libstdc++-v3/testsuite/20_util/scoped_allocator/construct_pair_c++2a.cc +++ b/libstdc++-v3/testsuite/20_util/scoped_allocator/construct_pair_c++2a.cc @@ -18,6 +18,8 @@ // { dg-options "-std=gnu++2a" } // { dg-do run { target c++2a } } +// P0591R4 makes uses-allocator construction apply recursively for nested pairs + #include #include #include