+2018-06-12 François Dumont <fdumont@gcc.gnu.org>
+
+ * include/debug/macros.h (__glibcxx_check_can_increment_range): New.
+ (__glibcxx_check_can_decrement_range): New.
+ * include/debug/debug.h (__glibcxx_requires_can_increment_range): New.
+ (__glibcxx_requires_can_decrement_range): New.
+ * include/bits/stl_algobase.h (std::copy(_II, _II, _OI)): Use
+ __glibcxx_requires_can_increment_range.
+ (std::move(_II, _II, _OI)): Likewise.
+ (std::copy_backward(_BI, _BI, _BI2)): Use
+ __glibcxx_requires_can_decrement_range.
+ (std::move_backward(_BI, _BI, _BI2)): Likewise.
+ * testsuite/25_algorithms/copy_backward/debug/1_neg.cc: New.
+ * testsuite/25_algorithms/copy_backward/debug/2_neg.cc: New.
+ * testsuite/25_algorithms/copy_backward/debug/3_neg.cc: New.
+ * testsuite/25_algorithms/equal/debug/1_neg.cc: New.
+ * testsuite/25_algorithms/equal/debug/2_neg.cc: New.
+ * testsuite/25_algorithms/equal/debug/3_neg.cc: New.
+
2018-06-12 Jonathan Wakely <jwakely@redhat.com>
P0935R0 Eradicating unnecessarily explicit default constructors
__glibcxx_function_requires(_InputIteratorConcept<_II>)
__glibcxx_function_requires(_OutputIteratorConcept<_OI,
typename iterator_traits<_II>::value_type>)
- __glibcxx_requires_valid_range(__first, __last);
+ __glibcxx_requires_can_increment_range(__first, __last, __result);
- return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
- (std::__miter_base(__first), std::__miter_base(__last),
- __result));
+ return std::__copy_move_a2<__is_move_iterator<_II>::__value>
+ (std::__miter_base(__first), std::__miter_base(__last), __result);
}
#if __cplusplus >= 201103L
__glibcxx_function_requires(_InputIteratorConcept<_II>)
__glibcxx_function_requires(_OutputIteratorConcept<_OI,
typename iterator_traits<_II>::value_type>)
- __glibcxx_requires_valid_range(__first, __last);
+ __glibcxx_requires_can_increment_range(__first, __last, __result);
return std::__copy_move_a2<true>(std::__miter_base(__first),
std::__miter_base(__last), __result);
__glibcxx_function_requires(_ConvertibleConcept<
typename iterator_traits<_BI1>::value_type,
typename iterator_traits<_BI2>::value_type>)
- __glibcxx_requires_valid_range(__first, __last);
+ __glibcxx_requires_can_decrement_range(__first, __last, __result);
- return (std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
- (std::__miter_base(__first), std::__miter_base(__last),
- __result));
+ return std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
+ (std::__miter_base(__first), std::__miter_base(__last), __result);
}
#if __cplusplus >= 201103L
__glibcxx_function_requires(_ConvertibleConcept<
typename iterator_traits<_BI1>::value_type,
typename iterator_traits<_BI2>::value_type>)
- __glibcxx_requires_valid_range(__first, __last);
+ __glibcxx_requires_can_decrement_range(__first, __last, __result);
return std::__copy_move_backward_a2<true>(std::__miter_base(__first),
std::__miter_base(__last),
* the user error and where the error is reported.
*
*/
+#define _GLIBCXX_DEBUG_VERIFY_COND_AT(_Cond,_ErrMsg,_File,_Line,_Func) \
+ if (! (_Cond)) \
+ __gnu_debug::_Error_formatter::_S_at(_File, _Line, _Func) \
+ ._ErrMsg._M_error()
+
#define _GLIBCXX_DEBUG_VERIFY_AT_F(_Cond,_ErrMsg,_File,_Line,_Func) \
do \
{ \
- if (! (_Cond)) \
- __gnu_debug::_Error_formatter::_S_at(_File, _Line, _Func) \
- ._ErrMsg._M_error(); \
+ _GLIBCXX_DEBUG_VERIFY_COND_AT(_Cond,_ErrMsg,_File,_Line,_Func); \
} while (false)
#define _GLIBCXX_DEBUG_VERIFY_AT(_Cond,_ErrMsg,_File,_Line) \
._M_iterator(_First, #_First) \
._M_iterator(_Last, #_Last))
+#define __glibcxx_check_can_increment_range(_First1,_Last1,_First2) \
+ do \
+ { \
+ typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\
+ _GLIBCXX_DEBUG_VERIFY_COND_AT( \
+ __gnu_debug::__valid_range(_First1, _Last1, __dist),\
+ _M_message(__gnu_debug::__msg_valid_range) \
+ ._M_iterator(_First1, #_First1) \
+ ._M_iterator(_Last1, #_Last1), \
+ __FILE__,__LINE__,__PRETTY_FUNCTION__); \
+ _GLIBCXX_DEBUG_VERIFY_COND_AT( \
+ __gnu_debug::__can_advance(_First2, __dist.first),\
+ _M_message(__gnu_debug::__msg_iter_subscript_oob)\
+ ._M_iterator(_First2, #_First2) \
+ ._M_integer(__dist.first), \
+ __FILE__,__LINE__,__PRETTY_FUNCTION__); \
+ } while(false)
+
+#define __glibcxx_check_can_decrement_range(_First1,_Last1,_First2) \
+ do \
+ { \
+ typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\
+ _GLIBCXX_DEBUG_VERIFY_COND_AT( \
+ __gnu_debug::__valid_range(_First1, _Last1, __dist),\
+ _M_message(__gnu_debug::__msg_valid_range) \
+ ._M_iterator(_First1, #_First1) \
+ ._M_iterator(_Last1, #_Last1), \
+ __FILE__,__LINE__,__PRETTY_FUNCTION__); \
+ _GLIBCXX_DEBUG_VERIFY_COND_AT( \
+ __gnu_debug::__can_advance(_First2, -__dist.first),\
+ _M_message(__gnu_debug::__msg_iter_subscript_oob)\
+ ._M_iterator(_First2, #_First2) \
+ ._M_integer(-__dist.first), \
+ __FILE__,__LINE__,__PRETTY_FUNCTION__); \
+ } while(false)
+
/** Verify that we can insert into *this with the iterator _Position.
* Insertion into a container at a specific position requires that
* the iterator be nonsingular, either dereferenceable or past-the-end,
* _Safe_sequence and the _Position iterator is a _Safe_iterator.
*/
#define __glibcxx_check_insert_range_after(_Position,_First,_Last,_Dist)\
- __glibcxx_check_valid_range2(_First,_Last,_Dist); \
+__glibcxx_check_valid_range2(_First,_Last,_Dist); \
__glibcxx_check_insert_after(_Position); \
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__foreign_iterator(_Position,_First,_Last),\
_M_message(__gnu_debug::__msg_insert_range_from_self)\
--- /dev/null
+// Copyright (C) 2018 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/>.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+ std::vector<int> vect;
+ vect.push_back(1);
+ std::copy_backward(vect.end(), vect.begin(), vect.end());
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// Copyright (C) 2018 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/>.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+ std::vector<int> vect;
+ vect.push_back(1);
+ std::copy_backward(vect.begin(), vect.end(), vect.begin());
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// Copyright (C) 2018 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/>.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <list>
+
+void
+test01()
+{
+ std::list<int> l1, l2;
+ l1.push_back(1);
+ l1.push_back(2);
+ l1.push_back(3);
+
+ l2.push_back(1);
+ std::copy_backward(++l1.begin(), l1.end(), l2.end());
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// Copyright (C) 2018 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/>.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+ std::vector<int> vect;
+ vect.push_back(1);
+ std::equal(vect.end(), vect.begin(), vect.begin());
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// Copyright (C) 2018 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/>.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+ std::vector<int> v1, v2;
+ v1.push_back(1);
+ std::equal(v1.begin(), v1.end(), v2.begin());
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// Copyright (C) 2018 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/>.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <list>
+
+void
+test01()
+{
+ std::list<int> l1, l2;
+ l1.push_back(1);
+ l1.push_back(2);
+ l1.push_back(3);
+
+ l2.push_back(1);
+ l2.push_back(2);
+
+ std::equal(++l1.begin(), l1.end(), ++l2.begin());
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}