From dbc6221fe5aa38017bb5818aa28257360b15f3b6 Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Mon, 6 Jun 2016 19:28:59 +0300 Subject: [PATCH] Support allocators in tuples of zero size. * include/std/tuple (tuple<>::tuple(), tuple<>::tuple(allocator_arg_t, const _Alloc&), tuple<>::tuple(allocator_arg_t, const _Alloc&, const tuple&)): New. * testsuite/20_util/tuple/cons/allocators.cc: Adjust. From-SVN: r237143 --- libstdc++-v3/ChangeLog | 8 +++++++ libstdc++-v3/include/std/tuple | 8 +++++++ .../20_util/tuple/cons/allocators.cc | 22 +++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b938ea2bb6d..f550c35eb15 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2016-06-06 Ville Voutilainen + + Support allocators in tuples of zero size. + * include/std/tuple (tuple<>::tuple(), + tuple<>::tuple(allocator_arg_t, const _Alloc&), + tuple<>::tuple(allocator_arg_t, const _Alloc&, const tuple&)): New. + * testsuite/20_util/tuple/cons/allocators.cc: Adjust. + 2016-06-06 Jonathan Wakely PR libstdc++/71320 diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple index 17c82049030..e64f6bfc5f5 100644 --- a/libstdc++-v3/include/std/tuple +++ b/libstdc++-v3/include/std/tuple @@ -876,6 +876,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { public: void swap(tuple&) noexcept { /* no-op */ } + // We need the default since we're going to define no-op + // allocator constructors. + tuple() = default; + // No-op allocator constructors. + template + tuple(allocator_arg_t, const _Alloc&) { } + template + tuple(allocator_arg_t, const _Alloc&, const tuple&) { } }; /// Partial specialization, 2-element tuple. diff --git a/libstdc++-v3/testsuite/20_util/tuple/cons/allocators.cc b/libstdc++-v3/testsuite/20_util/tuple/cons/allocators.cc index 052b79fcf83..bc45780cb98 100644 --- a/libstdc++-v3/testsuite/20_util/tuple/cons/allocators.cc +++ b/libstdc++-v3/testsuite/20_util/tuple/cons/allocators.cc @@ -162,8 +162,30 @@ void test01() } +void test02() +{ + bool test __attribute__((unused)) = true; + using std::allocator_arg; + using std::tuple; + using std::make_tuple; + + typedef tuple<> test_type; + + MyAlloc a; + + // default construction + test_type t1(allocator_arg, a); + // copy construction + test_type t2(allocator_arg, a, t1); + // move construction + test_type t3(allocator_arg, a, std::move(t1)); + // make_tuple + test_type empty = make_tuple(); +} + int main() { test01(); + test02(); return 0; } -- 2.30.2