+2012-07-13 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR libstdc++/53657
+ * include/bits/stl_pair.h (pair<>::pair(pair&&)): Declare defaulted,
+ per C++11.
+ * include/bits/stl_map.h (map<>::insert(_Pair&&), map<>::insert
+ (const_iterator, _Pair&&)): Constrain with std::is_constructible,
+ per LWG2005.
+ * include/bits/stl_multimap.h (multimap<>::insert(_Pair&&),
+ multimap<>::insert(const_iterator, _Pair&&)): Likewise.
+ * include/bits/hashtable_policy.h (_Insert<>::insert(_Pair&&),
+ _Insert<>::insert(const_iterator, _Pair&&)): Likewise.
+ * include/debug/unordered_map: Adjust.
+ * include/debug/map.h: Likewise.
+ * include/debug/multimap.h: Likewise.
+ * include/profile/unordered_map: Likewise.
+ * include/profile/map.h: Likewise.
+ * include/profile/multimap.h: Likewise.
+
2012-07-07 Jonathan Wakely <jwakely.gcc@gmail.com>
PR libstdc++/53578
template<typename _Pair, typename = typename
std::enable_if<__and_<integral_constant<bool, !__constant_iterators>,
- std::is_convertible<_Pair,
- value_type>>::value>::type>
+ std::is_constructible<value_type,
+ _Pair&&>>::value>::type>
_Insert_Return_Type
insert(_Pair&& __v)
{ return _M_insert(std::forward<_Pair>(__v),
template<typename _Pair, typename = typename
std::enable_if<__and_<integral_constant<bool, !__constant_iterators>,
- std::is_convertible<_Pair,
- value_type>>::value>::type>
+ std::is_constructible<value_type,
+ _Pair&&>>::value>::type>
iterator
insert(const_iterator, _Pair&& __v)
{ return _Insert_Conv_Type()(insert(std::forward<_Pair>(__v))); }
// Map implementation -*- C++ -*-
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-// 2011 Free Software Foundation, Inc.
+// 2011, 2012 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
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
std::pair<iterator, bool>
insert(_Pair&& __x)
{ return _M_t._M_insert_unique(std::forward<_Pair>(__x)); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __position, _Pair&& __x)
{ return _M_t._M_insert_unique_(__position,
// Multimap implementation -*- C++ -*-
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-// 2011 Free Software Foundation, Inc.
+// 2011, 2012 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
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(_Pair&& __x)
{ return _M_t._M_insert_equal(std::forward<_Pair>(__x)); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __position, _Pair&& __x)
{ return _M_t._M_insert_equal_(__position,
// Pair implementation -*- C++ -*-
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-// 2010, 2011
+// 2010, 2011, 2012
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
: first(__p.first), second(__p.second) { }
constexpr pair(const pair&) = default;
-
- // XXX Defaulted?!? Breaks std::map!!!
- pair(pair&& __p)
- noexcept(__and_<is_nothrow_move_constructible<_T1>,
- is_nothrow_move_constructible<_T2>>::value)
- : first(std::forward<first_type>(__p.first)),
- second(std::forward<second_type>(__p.second)) { }
+ constexpr pair(pair&&) = default;
// DR 811.
template<class _U1, class = typename
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
std::pair<iterator, bool>
insert(_Pair&& __x)
{
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __position, _Pair&& __x)
{
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(_Pair&& __x)
{ return iterator(_Base::insert(std::forward<_Pair>(__x)), this); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __position, _Pair&& __x)
{
}
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
std::pair<iterator, bool>
insert(_Pair&& __obj)
{
}
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __hint, _Pair&& __obj)
{
}
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(_Pair&& __obj)
{
}
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __hint, _Pair&& __obj)
{
// Profiling map implementation -*- C++ -*-
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2009, 2010, 2011, 2012 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
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
std::pair<iterator, bool>
insert(_Pair&& __x)
{
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __position, _Pair&& __x)
{
// Profiling multimap implementation -*- C++ -*-
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2009, 2010, 2011, 2012 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
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(_Pair&& __x)
{ return iterator(_Base::insert(std::forward<_Pair>(__x))); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __position, _Pair&& __x)
{ return iterator(_Base::insert(__position,
// Profiling unordered_map/unordered_multimap implementation -*- C++ -*-
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2009, 2010, 2011, 2012 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
}
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
std::pair<iterator, bool>
insert(_Pair&& __obj)
{
}
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __iter, _Pair&& __v)
{
}
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(_Pair&& __obj)
{
}
template<typename _Pair, typename = typename
- std::enable_if<std::is_convertible<_Pair,
- value_type>::value>::type>
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
iterator
insert(const_iterator __iter, _Pair&& __v)
{