+2012-03-04 Paolo Carlini <paolo.carlini@oracle.com>
+ Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ PR libstdc++/43813
+ * include/bits/stl_iterator_base_types.h (_RequireInputIter): New.
+ * include/ext/vstring.h (__versa_string<>::__versa_string
+ (_InputIterator, _InputIterator, const _Alloc&),
+ __versa_string<>::append(_InputIterator, _InputIterator),
+ __versa_string<>::assign(_InputIterator, _InputIterator),
+ __versa_string<>::insert(iterator, _InputIterator,
+ _InputIterator), __versa_string<>::replace(iterator, iterator,
+ _InputIterator, _InputIterator)): Use it.
+ * include/bits/stl_list.h (list<>::list(_InputIterator,
+ _InputIterator, const allocator_type&), list<>::assign(_InputIterator,
+ _InputIterator), list<>::insert(iterator, _InputIterator,
+ _InputIterator)): Likewise.
+ * include/bits/stl_vector.h (vector<>::vector(_InputIterator,
+ _InputIterator, const allocator_type&), vector<>::assign(_InputIterator,
+ _InputIterator), vectort<>::insert(iterator, _InputIterator,
+ _InputIterator)): Likewise.
+ * include/bits/stl_deque.h (deque<>::deque(_InputIterator,
+ _InputIterator, const allocator_type&), deque<>::deque(_InputIterator,
+ _InputIterator), deque<>::insert(iterator, _InputIterator,
+ _InputIterator)): Likewise.
+ * include/bits/stl_bvector.h (vector<>::vector(_InputIterator,
+ _InputIterator, const allocator_type&), vector<>::deque(_InputIterator,
+ _InputIterator), vector<>::insert(iterator, _InputIterator,
+ _InputIterator)): Likewise.
+ * include/bits/forward_list.h (forward_list<>::forward_list
+ (_InputIterator, _InputIterator, const allocator_type&),
+ forward_list<>::assign(_InputIterator, _InputIterator),
+ forward_list<>::insert_after(const_iterator, _InputIterator,
+ _InputIterator)): Likewise.
+ (forward_list<>::_M_initialize_dispatch(,, __true_type): Remove.
+ (forward_list<>::_M_range_initialize): Add, adjust everywhere.
+ * include/bits/forward_list.tcc: Adjust.
+ * include/debug/forward_list: Adjust.
+ * include/debug/vector: Likewise.
+ * include/debug/deque: Likewise.
+ * include/debug/list: Likewise.
+ * testsuite/ext/vstring/requirements/do_the_right_thing.cc: New.
+ * testsuite/23_containers/forward_list/requirements/
+ do_the_right_thing.cc: Likewise.
+ * testsuite/23_containers/vector/requirements/
+ do_the_right_thing.cc: Likewise.
+ * testsuite/23_containers/deque/requirements/
+ do_the_right_thing.cc: Likewise.
+ * testsuite/23_containers/list/requirements/
+ do_the_right_thing.cc: Likewise.
+ * testsuite/23_containers/forward_list/requirements/dr438/
+ assign_neg.cc: Adjust dg-error line number.
+ * testsuite/23_containers/forward_list/requirements/dr438/
+ insert_neg.cc: Likewise.
+ * testsuite/23_containers/forward_list/requirements/dr438/
+ constructor_1_neg.cc: Likewise.
+ * testsuite/23_containers/forward_list/requirements/dr438/
+ constructor_2_neg.cc: Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/
+ assign_neg.cc: Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/
+ insert_neg.cc: Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/
+ constructor_1_neg.cc: Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/
+ constructor_2_neg.cc: Likewise.
+ * testsuite/23_containers/deque/requirements/dr438/
+ assign_neg.cc: Likewise.
+ * testsuite/23_containers/deque/requirements/dr438/
+ insert_neg.cc: Likewise.
+ * testsuite/23_containers/deque/requirements/dr438/
+ constructor_1_neg.cc: Likewise.
+ * testsuite/23_containers/deque/requirements/dr438/
+ constructor_2_neg.cc: Likewise.
+ * testsuite/23_containers/list/requirements/dr438/
+ assign_neg.cc: Likewise.
+ * testsuite/23_containers/list/requirements/dr438/
+ insert_neg.cc: Likewise.
+ * testsuite/23_containers/list/requirements/dr438/
+ constructor_1_neg.cc: Likewise.
+ * testsuite/23_containers/list/requirements/dr438/
+ constructor_2_neg.cc: Likewise.
+
2012-03-04 Jonathan Wakely <jwakely.gcc@gmail.com>
PR libstdc++/52433
// <forward_list.h> -*- C++ -*-
-// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2008, 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
* [@a __first,@a __last). This is linear in N (where N is
* distance(@a __first,@a __last)).
*/
- template<typename _InputIterator>
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
forward_list(_InputIterator __first, _InputIterator __last,
const _Alloc& __al = _Alloc())
: _Base(_Node_alloc_type(__al))
- {
- // Check whether it's an integral type. If so, it's not an iterator.
- typedef typename std::__is_integer<_InputIterator>::__type _Integral;
- _M_initialize_dispatch(__first, __last, _Integral());
- }
+ { _M_range_initialize(__first, __last); }
/**
* @brief The %forward_list copy constructor.
*/
forward_list(const forward_list& __list)
: _Base(__list._M_get_Node_allocator())
- { _M_initialize_dispatch(__list.begin(), __list.end(), __false_type()); }
+ { _M_range_initialize(__list.begin(), __list.end()); }
/**
* @brief The %forward_list move constructor.
forward_list(std::initializer_list<_Tp> __il,
const _Alloc& __al = _Alloc())
: _Base(_Node_alloc_type(__al))
- { _M_initialize_dispatch(__il.begin(), __il.end(), __false_type()); }
+ { _M_range_initialize(__il.begin(), __il.end()); }
/**
* @brief The forward_list dtor.
* that the resulting %forward_list's size is the same as the number
* of elements assigned. Old data may be lost.
*/
- template<typename _InputIterator>
- void
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
assign(_InputIterator __first, _InputIterator __last)
{
clear();
* This operation is linear in the number of elements inserted and
* does not invalidate iterators and references.
*/
- template<typename _InputIterator>
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
iterator
insert_after(const_iterator __pos,
_InputIterator __first, _InputIterator __last);
{ this->_M_impl._M_head._M_reverse_after(); }
private:
- template<typename _Integer>
- void
- _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
- { _M_fill_initialize(static_cast<size_type>(__n), __x); }
-
// Called by the range constructor to implement [23.1.1]/9
template<typename _InputIterator>
void
- _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
- __false_type);
+ _M_range_initialize(_InputIterator __first, _InputIterator __last);
// Called by forward_list(n,v,a), and the range constructor when it
// turns out to be the same thing.
// <forward_list.tcc> -*- C++ -*-
-// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2008, 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 _InputIterator>
void
forward_list<_Tp, _Alloc>::
- _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
- __false_type)
+ _M_range_initialize(_InputIterator __first, _InputIterator __last)
{
_Node_base* __to = &this->_M_impl._M_head;
for (; __first != __last; ++__first)
}
}
- // Called by forward_list(n,v,a), and the range constructor
- // when it turns out to be the same thing.
+ // Called by forward_list(n,v,a).
template<typename _Tp, typename _Alloc>
void
forward_list<_Tp, _Alloc>::
}
template<typename _Tp, typename _Alloc>
- template<typename _InputIterator>
+ template<typename _InputIterator, typename>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::
insert_after(const_iterator __pos,
// vector<bool> specialization -*- 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
}
#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ vector(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a = allocator_type())
+ : _Base(__a)
+ { _M_initialize_dispatch(__first, __last, __false_type()); }
+#else
template<typename _InputIterator>
vector(_InputIterator __first, _InputIterator __last,
const allocator_type& __a = allocator_type())
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_initialize_dispatch(__first, __last, _Integral());
}
+#endif
~vector() _GLIBCXX_NOEXCEPT { }
assign(size_type __n, const bool& __x)
{ _M_fill_assign(__n, __x); }
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
+ assign(_InputIterator __first, _InputIterator __last)
+ { _M_assign_dispatch(__first, __last, __false_type()); }
+#else
template<typename _InputIterator>
void
assign(_InputIterator __first, _InputIterator __last)
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_assign_dispatch(__first, __last, _Integral());
}
+#endif
#ifdef __GXX_EXPERIMENTAL_CXX0X__
void
return begin() + __n;
}
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
+ insert(iterator __position,
+ _InputIterator __first, _InputIterator __last)
+ { _M_insert_dispatch(__position, __first, __last, __false_type()); }
+#else
template<typename _InputIterator>
void
insert(iterator __position,
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_insert_dispatch(__position, __first, __last, _Integral());
}
+#endif
void
insert(iterator __position, size_type __n, const bool& __x)
// Deque 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
* input iterators are used, then this will do at most 2N calls to the
* copy constructor, and logN memory reallocations.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ deque(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a = allocator_type())
+ : _Base(__a)
+ { _M_initialize_dispatch(__first, __last, __false_type()); }
+#else
template<typename _InputIterator>
deque(_InputIterator __first, _InputIterator __last,
const allocator_type& __a = allocator_type())
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_initialize_dispatch(__first, __last, _Integral());
}
+#endif
/**
* The dtor only erases the elements, and note that if the elements
* resulting %deque's size is the same as the number of elements
* assigned. Old data may be lost.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
+ assign(_InputIterator __first, _InputIterator __last)
+ { _M_assign_dispatch(__first, __last, __false_type()); }
+#else
template<typename _InputIterator>
void
assign(_InputIterator __first, _InputIterator __last)
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_assign_dispatch(__first, __last, _Integral());
}
+#endif
#ifdef __GXX_EXPERIMENTAL_CXX0X__
/**
* [__first,__last) into the %deque before the location specified
* by @a __position. This is known as <em>range insert</em>.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
+ insert(iterator __position, _InputIterator __first,
+ _InputIterator __last)
+ { _M_insert_dispatch(__position, __first, __last, __false_type()); }
+#else
template<typename _InputIterator>
void
insert(iterator __position, _InputIterator __first,
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_insert_dispatch(__position, __first, __last, _Integral());
}
+#endif
/**
* @brief Remove element at given position.
// Types used in iterator implementation -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+// 2010, 2011, 2012
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
#include <bits/c++config.h>
#ifdef __GXX_EXPERIMENTAL_CXX0X__
-# include <type_traits> // For _GLIBCXX_HAS_NESTED_TYPE
+# include <type_traits> // For _GLIBCXX_HAS_NESTED_TYPE, is_convertible
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{ return __it.base(); }
};
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InIter>
+ using _RequireInputIter = typename
+ enable_if<is_convertible<typename
+ iterator_traits<_InIter>::iterator_category,
+ input_iterator_tag>::value>::type;
+#endif
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
// List 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
* [@a __first,@a __last). This is linear in N (where N is
* distance(@a __first,@a __last)).
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ list(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a = allocator_type())
+ : _Base(_Node_alloc_type(__a))
+ { _M_initialize_dispatch(__first, __last, __false_type()); }
+#else
template<typename _InputIterator>
list(_InputIterator __first, _InputIterator __last,
const allocator_type& __a = allocator_type())
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_initialize_dispatch(__first, __last, _Integral());
}
+#endif
/**
* No explicit dtor needed as the _Base dtor takes care of
* that the resulting %list's size is the same as the number of
* elements assigned. Old data may be lost.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
+ assign(_InputIterator __first, _InputIterator __last)
+ { _M_assign_dispatch(__first, __last, __false_type()); }
+#else
template<typename _InputIterator>
void
assign(_InputIterator __first, _InputIterator __last)
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_assign_dispatch(__first, __last, _Integral());
}
+#endif
#ifdef __GXX_EXPERIMENTAL_CXX0X__
/**
* This operation is linear in the number of elements inserted and
* does not invalidate iterators and references.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<typename _InputIterator>
+#endif
void
insert(iterator __position, _InputIterator __first,
_InputIterator __last)
// Vector 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
* used, then this will do at most 2N calls to the copy
* constructor, and logN memory reallocations.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ vector(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a = allocator_type())
+ : _Base(__a)
+ { _M_initialize_dispatch(__first, __last, __false_type()); }
+#else
template<typename _InputIterator>
vector(_InputIterator __first, _InputIterator __last,
const allocator_type& __a = allocator_type())
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_initialize_dispatch(__first, __last, _Integral());
}
+#endif
/**
* The dtor only erases the elements, and note that if the
* that the resulting %vector's size is the same as the number
* of elements assigned. Old data may be lost.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
+ assign(_InputIterator __first, _InputIterator __last)
+ { _M_assign_dispatch(__first, __last, __false_type()); }
+#else
template<typename _InputIterator>
void
assign(_InputIterator __first, _InputIterator __last)
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_assign_dispatch(__first, __last, _Integral());
}
+#endif
#ifdef __GXX_EXPERIMENTAL_CXX0X__
/**
* %vector and if it is frequently used the user should
* consider using std::list.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
+ insert(iterator __position, _InputIterator __first,
+ _InputIterator __last)
+ { _M_insert_dispatch(__position, __first, __last, __false_type()); }
+#else
template<typename _InputIterator>
void
insert(iterator __position, _InputIterator __first,
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
_M_insert_dispatch(__position, __first, __last, _Integral());
}
+#endif
/**
* @brief Remove element at given position.
// Debugging deque implementation -*- C++ -*-
-// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+// 2012
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
: _Base(__n, __value, __a) { }
#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
deque(_InputIterator __first, _InputIterator __last,
const _Allocator& __a = _Allocator())
: _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first,
}
#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
void
assign(_InputIterator __first, _InputIterator __last)
{
this->_M_invalidate_all();
}
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
void
insert(iterator __position,
_InputIterator __first, _InputIterator __last)
// <forward_list> -*- C++ -*-
-// Copyright (C) 2010 Free Software Foundation, Inc.
+// Copyright (C) 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
: _Base(__n, __value, __al)
{ }
- template<typename _InputIterator>
- forward_list(_InputIterator __first, _InputIterator __last,
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ forward_list(_InputIterator __first, _InputIterator __last,
const _Alloc& __al = _Alloc())
: _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first,
__last)),
return *this;
}
- template<typename _InputIterator>
- void
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ void
assign(_InputIterator __first, _InputIterator __last)
{
__glibcxx_check_valid_range(__first, __last);
this);
}
- template<typename _InputIterator>
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
iterator
insert_after(const_iterator __pos,
_InputIterator __first, _InputIterator __last)
// Debugging list implementation -*- C++ -*-
-// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+// 2012
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
: _Base(__n, __value, __a) { }
#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
- list(_InputIterator __first, _InputIterator __last,
- const _Allocator& __a = _Allocator())
- : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first,
- __last)),
- __gnu_debug::__base(__last), __a)
- { }
-
+#endif
+ list(_InputIterator __first, _InputIterator __last,
+ const _Allocator& __a = _Allocator())
+ : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first,
+ __last)),
+ __gnu_debug::__base(__last), __a)
+ { }
list(const list& __x)
: _Base(__x) { }
}
#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
void
assign(_InputIterator __first, _InputIterator __last)
{
_Base::insert(__position.base(), __n, __x);
}
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
void
insert(iterator __position, _InputIterator __first,
_InputIterator __last)
// Debugging vector implementation -*- C++ -*-
-// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+// 2012
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
: _Base(__n, __value, __a), _M_guaranteed_capacity(__n) { }
#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
vector(_InputIterator __first, _InputIterator __last,
const _Allocator& __a = _Allocator())
: _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first,
}
#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<typename _InputIterator>
+#endif
void
assign(_InputIterator __first, _InputIterator __last)
{
_M_update_guaranteed_capacity();
}
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
void
insert(iterator __position,
_InputIterator __first, _InputIterator __last)
// Versatile string -*- C++ -*-
-// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
+// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
* @param __end End of range.
* @param __a Allocator to use (default is default allocator).
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
__versa_string(_InputIterator __beg, _InputIterator __end,
const _Alloc& __a = _Alloc())
: __vstring_base(__beg, __end, __a) { }
*
* Appends characters in the range [first,last) to this string.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
__versa_string&
append(_InputIterator __first, _InputIterator __last)
{ return this->replace(_M_iend(), _M_iend(), __first, __last); }
* Sets value of string to characters in the range
* [first,last).
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
__versa_string&
assign(_InputIterator __first, _InputIterator __last)
{ return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
* thrown. The value of the string doesn't change if an error
* is thrown.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<class _InputIterator>
+#endif
void
insert(iterator __p, _InputIterator __beg, _InputIterator __end)
{ this->replace(__p, __p, __beg, __end); }
* of result exceeds max_size(), length_error is thrown. The
* value of the string doesn't change if an error is thrown.
*/
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ template<class _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+ __versa_string&
+ replace(iterator __i1, iterator __i2,
+ _InputIterator __k1, _InputIterator __k2)
+ {
+ _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
+ && __i2 <= _M_iend());
+ __glibcxx_requires_valid_range(__k1, __k2);
+ return this->_M_replace_dispatch(__i1, __i2, __k1, __k2,
+ std::__false_type());
+ }
+#else
template<class _InputIterator>
__versa_string&
replace(iterator __i1, iterator __i2,
typedef typename std::__is_integer<_InputIterator>::__type _Integral;
return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
}
+#endif
// Specializations for the common case of pointer and iterator:
// useful to avoid the overhead of temporary buffering in _M_replace.
--- /dev/null
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 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
+// 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 Pred 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 <deque>
+
+// libstdc++/43813
+void test01()
+{
+ std::deque<double*> d(7, 0);
+ d.assign(7, 0);
+ d.insert(d.begin(), 7, 0);
+}
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1670 }
+// { dg-error "no matching" "" { target *-*-* } 1696 }
#include <deque>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1603 }
+// { dg-error "no matching" "" { target *-*-* } 1629 }
#include <deque>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1603 }
+// { dg-error "no matching" "" { target *-*-* } 1629 }
#include <deque>
#include <utility>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1754 }
+// { dg-error "no matching" "" { target *-*-* } 1780 }
#include <deque>
--- /dev/null
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 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
+// 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 Pred 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 <forward_list>
+
+// libstdc++/43813
+void test01()
+{
+ std::forward_list<double*> fl(7, 0);
+ fl.assign(7, 0);
+ fl.insert_after(fl.before_begin(), 7, 0);
+}
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1213 }
+// { dg-error "no matching" "" { target *-*-* } 33 }
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1213 }
+// { dg-error "no matching" "" { target *-*-* } 27 }
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1213 }
+// { dg-error "no matching" "" { target *-*-* } 28 }
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1213 }
+// { dg-error "no matching" "" { target *-*-* } 33 }
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
--- /dev/null
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 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
+// 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 Pred 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 <list>
+
+// libstdc++/43813
+void test01()
+{
+ std::list<double*> l(7, 0);
+ l.assign(7, 0);
+ l.insert(l.begin(), 7, 0);
+}
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1552 }
+// { dg-error "no matching" "" { target *-*-* } 1574 }
#include <list>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1508 }
+// { dg-error "no matching" "" { target *-*-* } 1530 }
#include <list>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1508 }
+// { dg-error "no matching" "" { target *-*-* } 1530 }
#include <list>
#include <utility>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1508 }
+// { dg-error "no matching" "" { target *-*-* } 1530 }
#include <list>
--- /dev/null
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 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
+// 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 Pred 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 <vector>
+
+// libstdc++/43813
+void test01()
+{
+ std::vector<double*> v(7, 0);
+ v.assign(7, 0);
+ v.insert(v.begin(), 7, 0);
+}
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1225 }
+// { dg-error "no matching" "" { target *-*-* } 1251 }
#include <vector>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1155 }
+// { dg-error "no matching" "" { target *-*-* } 1181 }
#include <vector>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1155 }
+// { dg-error "no matching" "" { target *-*-* } 1181 }
#include <vector>
#include <utility>
// 2007-04-27 Paolo Carlini <pcarlini@suse.de>
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation
//
// 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
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1266 }
+// { dg-error "no matching" "" { target *-*-* } 1292 }
#include <vector>
--- /dev/null
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 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
+// 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 Pred 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 <ext/vstring.h>
+
+// libstdc++/43813
+void test01()
+{
+ __gnu_cxx::__versa_string<double*> vs(7, 0);
+ vs.assign(7, 0);
+ vs.append(7, 0);
+ vs.insert(vs.begin(), 7, 0);
+ vs.replace(vs.begin(), vs.end(), 7, 0);
+}