diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-30 02:29:14 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-30 02:29:14 +0000 |
commit | fe03d4d8ecf57e389d915b5b652d2e8d4ad884eb (patch) | |
tree | 5d41876da28d22a524959c5c7f3b6792d5225de6 /libstdc++-v3 | |
parent | df700d562cd3c654ec54c6f4d0e993d4222f2d3f (diff) | |
download | gcc-fe03d4d8ecf57e389d915b5b652d2e8d4ad884eb.tar.gz |
2009-10-29 Paolo Carlini <paolo.carlini@oracle.com>
Douglas Gregor <doug.gregor@gmail.com>
PR libstdc++/40925 (again)
* include/bits/stl_pair.h (pair<_T1, _T2>::pair(_U1&&, const _T2&),
pair<_T1, _T2>::pair(const _T1&, _U2&&)): Add, to deal correctly
with move-only types in the presence of "null pointers".
* testsuite/20_util/pair/40925.cc: Extend.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153733 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_pair.h | 21 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/pair/40925.cc | 21 |
3 files changed, 47 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2929d5a7252..402d7fb87e4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,4 +1,13 @@ 2009-10-29 Paolo Carlini <paolo.carlini@oracle.com> + Douglas Gregor <doug.gregor@gmail.com> + + PR libstdc++/40925 (again) + * include/bits/stl_pair.h (pair<_T1, _T2>::pair(_U1&&, const _T2&), + pair<_T1, _T2>::pair(const _T1&, _U2&&)): Add, to deal correctly + with move-only types in the presence of "null pointers". + * testsuite/20_util/pair/40925.cc: Extend. + +2009-10-29 Paolo Carlini <paolo.carlini@oracle.com> * include/std/type_traits (__is_int_or_cref): Remove. (__is_convertible_helper): Fix per C++0x and simplify (the hack to diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h index 0e153d3e7fd..4a9fb6be485 100644 --- a/libstdc++-v3/include/bits/stl_pair.h +++ b/libstdc++-v3/include/bits/stl_pair.h @@ -88,10 +88,23 @@ _GLIBCXX_BEGIN_NAMESPACE(std) : first(__a), second(__b) { } #ifdef __GXX_EXPERIMENTAL_CXX0X__ - template<class _U1, class _U2> - pair(_U1&& __x, _U2&& __y, typename - std::enable_if<std::is_convertible<_U1, _T1>::value - && std::is_convertible<_U2, _T2>::value>::type* = 0) + // DR 811. + template<class _U1, class = typename + std::enable_if<std::is_convertible<_U1, _T1>::value>::type> + pair(_U1&& __x, const _T2& __y) + : first(std::forward<_U1>(__x)), + second(__y) { } + + template<class _U2, class = typename + std::enable_if<std::is_convertible<_U2, _T2>::value>::type> + pair(const _T1& __x, _U2&& __y) + : first(__x), + second(std::forward<_U2>(__y)) { } + + template<class _U1, class _U2, class = typename + std::enable_if<std::is_convertible<_U1, _T1>::value + && std::is_convertible<_U2, _T2>::value>::type> + pair(_U1&& __x, _U2&& __y) : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { } diff --git a/libstdc++-v3/testsuite/20_util/pair/40925.cc b/libstdc++-v3/testsuite/20_util/pair/40925.cc index 491235d6e0b..6abeb617fa0 100644 --- a/libstdc++-v3/testsuite/20_util/pair/40925.cc +++ b/libstdc++-v3/testsuite/20_util/pair/40925.cc @@ -28,6 +28,15 @@ private: X(const X&) = delete; }; +struct move_only +{ + move_only() { } + move_only(move_only&&) { } + +private: + move_only(const move_only&) = delete; +}; + // libstdc++/40925 void test01() { @@ -43,4 +52,16 @@ void test01() std::pair<int X::*, int X::*> p6(mp, 0); std::pair<int X::*, int X::*> p7(0, mp); std::pair<int X::*, int X::*> p8(mp, mp); + + std::pair<int*, move_only> p9(0, move_only()); + std::pair<int X::*, move_only> p10(0, move_only()); + std::pair<move_only, int*> p11(move_only(), 0); + std::pair<move_only, int X::*> p12(move_only(), 0); + + std::pair<int*, move_only> p13(ip, move_only()); + std::pair<int X::*, move_only> p14(mp, move_only()); + std::pair<move_only, int*> p15(move_only(), ip); + std::pair<move_only, int X::*> p16(move_only(), mp); + + std::pair<move_only, move_only> p17(move_only(), move_only()); } |