aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2008-10-27 16:50:23 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2008-10-27 16:50:23 +0000
commit8f0f2a1dfd96bc496c50a264d2482daa254490aa (patch)
tree480aa8d3ec7622f0b85b44490fe14c83e8190ec3
parent202e781535186eb19b4d1bb2e737f2088d5c9141 (diff)
downloadgcc-8f0f2a1dfd96bc496c50a264d2482daa254490aa.zip
gcc-8f0f2a1dfd96bc496c50a264d2482daa254490aa.tar.gz
gcc-8f0f2a1dfd96bc496c50a264d2482daa254490aa.tar.bz2
re PR libstdc++/37919 ([c++0x] GCC 4.4 regression r141214 of gcc c++0x stl_pair.c causes a boost 1.36 compilation to fail)
2008-10-27 Paolo Carlini <paolo.carlini@oracle.com> PR libstdc++/37919 Revert: 2008-10-18 Douglas Gregor <doug.gregor@gmail.com> * include/bits/stl_pair.h (__may_be_null_pointer_init): New. (pair::pair): Eliminate the redundant pair(U1&&, U2&&) constructor. Add lvalue pair<U1, U2> constructor to handle non-const pair lvalues. Remove the old variadic constructor, and instead provide several variadic constructors that avoid failing when attempting to initialize a pointer from a null pointer constant. * testsuite/20_util/pair/moveable.cc (test3): Add new tests with initialization of pointers from the null pointer constant. From-SVN: r141388
-rw-r--r--libstdc++-v3/ChangeLog15
-rw-r--r--libstdc++-v3/include/bits/stl_pair.h91
-rw-r--r--libstdc++-v3/testsuite/20_util/pair/moveable.cc45
3 files changed, 24 insertions, 127 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index af59f63..4230bc6 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,20 @@
2008-10-27 Paolo Carlini <paolo.carlini@oracle.com>
+ PR libstdc++/37919
+ Revert:
+ 2008-10-18 Douglas Gregor <doug.gregor@gmail.com>
+
+ * include/bits/stl_pair.h (__may_be_null_pointer_init): New.
+ (pair::pair): Eliminate the redundant pair(U1&&, U2&&) constructor.
+ Add lvalue pair<U1, U2> constructor to handle non-const pair lvalues.
+ Remove the old variadic constructor, and instead provide several
+ variadic constructors that avoid failing when attempting to
+ initialize a pointer from a null pointer constant.
+ * testsuite/20_util/pair/moveable.cc (test3): Add new tests with
+ initialization of pointers from the null pointer constant.
+
+2008-10-27 Paolo Carlini <paolo.carlini@oracle.com>
+
PR libstdc++/37522
* config/os/mingw32/os_defines.h: Define _GLIBCXX_HAVE_BROKEN_VSWPRINTF
* include/bits/basic_string.h: Guard string conversions with
diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h
index c169275..cf61b09 100644
--- a/libstdc++-v3/include/bits/stl_pair.h
+++ b/libstdc++-v3/include/bits/stl_pair.h
@@ -65,35 +65,8 @@
#include <bits/move.h> // for std::move / std::forward, std::decay, and
// std::swap
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-#include <type_traits>
-#endif
-
_GLIBCXX_BEGIN_NAMESPACE(std)
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-// A trait that determines whether the initialization of a T from
-// arguments of type Args could possibly be the initialization of a
-// pointer from a null pointer constant.
-template<typename, typename...>
-struct __may_be_null_pointer_init
- : public false_type { };
-
-template<typename _Tp, typename _Up>
-struct __may_be_null_pointer_init<_Tp*, _Up>
- : public integral_constant<bool,
- (is_integral<typename remove_reference<_Up>::type>::value
- || is_enum<typename remove_reference<_Up>::type>::value)>
- { };
-
-template<typename _Class, typename _Tp, typename _Up>
-struct __may_be_null_pointer_init<_Tp _Class::*, _Up>
- : public integral_constant<bool,
- (is_integral<typename remove_reference<_Up>::type>::value
- || is_enum<typename remove_reference<_Up>::type>::value)>
- { };
-#endif
-
/// pair holds two objects of arbitrary type.
template<class _T1, class _T2>
struct pair
@@ -116,12 +89,10 @@ struct __may_be_null_pointer_init<_Tp _Class::*, _Up>
: first(__a), second(__b) { }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
- // Omitted the following constructor, which appears in the C++0x
- // working paper but is redundant with the variadic constructors
- // below.
- //
- // template<class _U1, class _U2>
- // pair(_U1&& __x, _U2&& __y);
+ template<class _U1, class _U2>
+ pair(_U1&& __x, _U2&& __y)
+ : first(std::forward<_U1>(__x)),
+ second(std::forward<_U2>(__y)) { }
pair(pair&& __p)
: first(std::move(__p.first)),
@@ -140,56 +111,12 @@ struct __may_be_null_pointer_init<_Tp _Class::*, _Up>
: first(std::move(__p.first)),
second(std::move(__p.second)) { }
- // This constructor is required so that lvalue pairs don't get
- // pushed to the variadic constructor below.
- template<class _U1, class _U2>
- pair(pair<_U1, _U2>& __p)
- : first(const_cast<const pair<_U1, _U2>&>(__p).first),
- second(const_cast<const pair<_U1, _U2>&>(__p).second) { }
-
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 811. pair of pointers no longer works with literal 0
-
- // Variadic constructor. The enable_if makes sure that we won't
- // try to initialize a pointer from an integral type, which
- // needs to be handled by a different constructor that will
- // convert a null pointer constant to that pointer type. See
- // library issue 767.
- template<class _U1, class... _Args,
- class _Checker
- = typename enable_if<
- (!__may_be_null_pointer_init<_T1, _U1>::value
- && !__may_be_null_pointer_init<_T2, _Args...>::value),
- void>::type>
- pair(_U1&& __x, _Args&&... __args)
- : first(std::forward<_U1>(__x)),
- second(std::forward<_Args>(__args)...) { }
-
- // Variadic constructor. The enable_if makes sure that the
- // second argument isn't going to try to initialize a pointer
- // from an integral type. However, T1 may be a pointer whose
- // argument was a null pointer constant.
- template<class... _Args,
- class _Checker
- = typename enable_if<
- !__may_be_null_pointer_init<_T2, _Args...>::value,
- void>::type>
- pair(const _T1& __x, _Args&&... __args)
- : first(__x),
- second(std::forward<_Args>(__args)...) { }
-
- // Constructor typically used when T2 is a pointer and the
- // second argument was a null pointer constant. The enable_if
- // makes sure that the first argument isn't going to try to
- // initialize a pointer from an integral type.
- template<class _U1,
- class _Checker
- = typename enable_if<
- !__may_be_null_pointer_init<_T1, _U1>::value,
- void>::type>
- pair(_U1&& __x, const _T2& __y)
+ // http://gcc.gnu.org/ml/libstdc++/2007-08/msg00052.html
+ template<class _U1, class _Arg0, class... _Args>
+ pair(_U1&& __x, _Arg0&& __arg0, _Args&&... __args)
: first(std::forward<_U1>(__x)),
- second(__y) { }
+ second(std::forward<_Arg0>(__arg0),
+ std::forward<_Args>(__args)...) { }
pair&
operator=(pair&& __p)
diff --git a/libstdc++-v3/testsuite/20_util/pair/moveable.cc b/libstdc++-v3/testsuite/20_util/pair/moveable.cc
index 4e5c535..cd5de41 100644
--- a/libstdc++-v3/testsuite/20_util/pair/moveable.cc
+++ b/libstdc++-v3/testsuite/20_util/pair/moveable.cc
@@ -64,54 +64,9 @@ test2()
r.second.size() == 2 && p.second.size() == 0);
}
-struct X {
- explicit X(int, int) { }
-
-private:
- X(const X&) = delete;
-};
-
-struct move_only {
- move_only() { }
- move_only(move_only&&) { }
-
-private:
- move_only(const move_only&) = delete;
-};
-
-void
-test3()
-{
- int *ip = 0;
- int X::*mp = 0;
- std::pair<int*, int*> p1(0, 0);
- std::pair<int*, int*> p2(ip, 0);
- std::pair<int*, int*> p3(0, ip);
- std::pair<int*, int*> p4(ip, ip);
-
- std::pair<int X::*, int*> p5(0, 0);
- 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*, X> p9(0, 1, 2);
- std::pair<int X::*, X> p10(0, 1, 2);
- std::pair<int*, X> p11(ip, 1, 2);
- std::pair<int X::*, X> p12(mp, 1, 2);
-
- std::pair<int*, move_only> p13(0);
- std::pair<int X::*, move_only> p14(0);
-
- std::pair<int*, move_only> p15(0, move_only());
- std::pair<int X::*, move_only> p16(0, move_only());
- std::pair<move_only, int*> p17(move_only(), 0);
- std::pair<move_only, int X::*> p18(move_only(), 0);
-}
-
int
main()
{
test1();
test2();
- test3();
}