+2019-04-26 Jonathan Wakely <jwakely@redhat.com>
+
+ * 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 <jakub@redhat.com>
* config/abi/post/s390x-linux-gnu/32/baseline_symbols.txt: Update.
}
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);
#if __cpp_concepts
template<typename _Tp>
- 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
#include <memory_resource>
#include <utility>
#include <tuple>
+#include <testsuite_hooks.h>
+#include <testsuite_allocator.h>
struct do_not_copy {
do_not_copy() = default;
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<int>;
+ 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<int>;
+ 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<X, int>, std::pair<int, Y>>;
+ __gnu_test::memory_resource mr;
+ std::pmr::polymorphic_allocator<int> a(&mr);
+ std::pmr::vector<value_type> 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();
test03();
test04();
test05();
+ test06();
}