aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2011-12-06 15:13:04 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2011-12-06 15:13:04 +0000
commit62b547b5f6aa7b86cd6a29501fd0ed2c259e1f6d (patch)
tree44ef218cd901a8d4cee7ffbbed9e50f7894de307
parent6232acfe4d905c0e79f3a088c0672eae3cc26eb8 (diff)
downloadgcc-62b547b5f6aa7b86cd6a29501fd0ed2c259e1f6d.zip
gcc-62b547b5f6aa7b86cd6a29501fd0ed2c259e1f6d.tar.gz
gcc-62b547b5f6aa7b86cd6a29501fd0ed2c259e1f6d.tar.bz2
re PR libstdc++/51183 (pair piecewise_construct_t constructor copies)
2011-12-06 Jonathan Wakely <jwakely.gcc@gmail.com> Chris Jefferson <chris@bubblescope.net> PR libstdc++/51183 * include/std/stl_pair.h (pair<>::__cons, pair<>::__do_cons): Remove. (pair<>::pair(piecewise_construct_t, tuple<>, tuple<>): Only declare. (pair<>::pair(tuple<>&, tuple<>&, _Index_tuple<>, _Index_tuple<>)): Declare. * include/std/tuple (pair<>::__cons, pair<>::__do_cons): Remove. (pair<>::pair(tuple<>&, tuple<>&, _Index_tuple<>, _Index_tuple<>)): Define. (pair<>::pair(piecewise_construct_t, tuple<>, tuple<>): Define, delegating to the latter. * testsuite/20_util/pair/piecewise2.cc: New. Co-Authored-By: Chris Jefferson <chris@bubblescope.net> From-SVN: r182054
-rw-r--r--libstdc++-v3/ChangeLog15
-rw-r--r--libstdc++-v3/include/bits/stl_pair.h18
-rw-r--r--libstdc++-v3/include/std/tuple31
-rw-r--r--libstdc++-v3/testsuite/20_util/pair/piecewise2.cc60
4 files changed, 99 insertions, 25 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index ca01b90..b93cc65 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,18 @@
+2011-12-06 Jonathan Wakely <jwakely.gcc@gmail.com>
+ Chris Jefferson <chris@bubblescope.net>
+
+ PR libstdc++/51183
+ * include/std/stl_pair.h (pair<>::__cons, pair<>::__do_cons): Remove.
+ (pair<>::pair(piecewise_construct_t, tuple<>, tuple<>): Only declare.
+ (pair<>::pair(tuple<>&, tuple<>&, _Index_tuple<>, _Index_tuple<>)):
+ Declare.
+ * include/std/tuple (pair<>::__cons, pair<>::__do_cons): Remove.
+ (pair<>::pair(tuple<>&, tuple<>&, _Index_tuple<>, _Index_tuple<>)):
+ Define.
+ (pair<>::pair(piecewise_construct_t, tuple<>, tuple<>): Define,
+ delegating to the latter.
+ * testsuite/20_util/pair/piecewise2.cc: New.
+
2011-12-05 Paolo Carlini <paolo.carlini@oracle.com>
* libsupc++/initializer_list: Do not declare anything if
diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h
index bb33cc6..c1df571 100644
--- a/libstdc++-v3/include/bits/stl_pair.h
+++ b/libstdc++-v3/include/bits/stl_pair.h
@@ -149,11 +149,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
: first(std::forward<_U1>(__p.first)),
second(std::forward<_U2>(__p.second)) { }
- template<class... _Args1, class... _Args2>
- pair(piecewise_construct_t,
- tuple<_Args1...> __first, tuple<_Args2...> __second)
- : first(__cons<first_type>(std::move(__first))),
- second(__cons<second_type>(std::move(__second))) { }
+ template<typename... _Args1, typename... _Args2>
+ pair(piecewise_construct_t, tuple<_Args1...>, tuple<_Args2...>);
pair&
operator=(const pair& __p)
@@ -202,13 +199,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
private:
- template<typename _Tp, typename... _Args>
- static _Tp
- __cons(tuple<_Args...>&&);
-
- template<typename _Tp, typename... _Args, std::size_t... _Indexes>
- static _Tp
- __do_cons(tuple<_Args...>&&, const _Index_tuple<_Indexes...>&);
+ template<typename... _Args1, std::size_t... _Indexes1,
+ typename... _Args2, std::size_t... _Indexes2>
+ pair(tuple<_Args1...>&, tuple<_Args2...>&,
+ _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>);
#endif
};
diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple
index 282d450..e8aaf46 100644
--- a/libstdc++-v3/include/std/tuple
+++ b/libstdc++-v3/include/std/tuple
@@ -1057,21 +1057,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// See stl_pair.h...
template<class _T1, class _T2>
- template<typename _Tp, typename... _Args>
- inline _Tp
- pair<_T1, _T2>::__cons(tuple<_Args...>&& __tuple)
- {
- typedef typename _Build_index_tuple<sizeof...(_Args)>::__type
- _Indexes;
- return __do_cons<_Tp>(std::move(__tuple), _Indexes());
- }
+ template<typename... _Args1, typename... _Args2>
+ inline
+ pair<_T1, _T2>::
+ pair(piecewise_construct_t,
+ tuple<_Args1...> __first, tuple<_Args2...> __second)
+ : pair(__first, __second,
+ typename _Build_index_tuple<sizeof...(_Args1)>::__type(),
+ typename _Build_index_tuple<sizeof...(_Args2)>::__type())
+ { }
template<class _T1, class _T2>
- template<typename _Tp, typename... _Args, std::size_t... _Indexes>
- inline _Tp
- pair<_T1, _T2>::__do_cons(tuple<_Args...>&& __tuple,
- const _Index_tuple<_Indexes...>&)
- { return _Tp(std::forward<_Args>(get<_Indexes>(__tuple))...); }
+ template<typename... _Args1, std::size_t... _Indexes1,
+ typename... _Args2, std::size_t... _Indexes2>
+ inline
+ pair<_T1, _T2>::
+ pair(tuple<_Args1...>& __tuple1, tuple<_Args2...>& __tuple2,
+ _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>)
+ : first(std::forward<_Args1>(std::get<_Indexes1>(__tuple1))...),
+ second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
+ { }
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
diff --git a/libstdc++-v3/testsuite/20_util/pair/piecewise2.cc b/libstdc++-v3/testsuite/20_util/pair/piecewise2.cc
new file mode 100644
index 0000000..695a3c9
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/pair/piecewise2.cc
@@ -0,0 +1,60 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <utility>
+#include <tuple>
+
+struct NoCon
+{
+ NoCon() = delete;
+ NoCon(const NoCon&) = delete;
+};
+
+struct RefCheck1
+{
+ RefCheck1(NoCon&, NoCon&&) { }
+ RefCheck1() = delete;
+ RefCheck1(const RefCheck1&) = delete;
+};
+
+struct RefCheck2
+{
+ RefCheck2(const NoCon&, const NoCon&&, NoCon&) { }
+ RefCheck2() = delete;
+ RefCheck2(const RefCheck2&) = delete;
+};
+
+struct Default
+{
+ Default();
+ Default(const Default&) = delete;
+};
+
+// libstdc++/51183
+void test01(std::tuple<NoCon&, NoCon&&> t1,
+ std::tuple<NoCon&, NoCon&&, NoCon&> t2)
+{
+ std::pair<RefCheck1, RefCheck2>(std::piecewise_construct, t1, t2);
+}
+
+void test02(std::tuple<> t1, std::tuple<int> t2)
+{
+ std::pair<Default, int> A(std::piecewise_construct, t1, t2);
+}