macros.h (__glibcxx_check_can_increment_range): New.

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.

From-SVN: r261525
This commit is contained in:
François Dumont 2018-06-12 20:18:35 +00:00
parent dd9db6f897
commit 84a9d3b6c1
9 changed files with 302 additions and 14 deletions

View File

@ -1,3 +1,22 @@
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

View File

@ -449,11 +449,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__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
@ -482,7 +481,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__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);
@ -627,11 +626,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__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
@ -663,7 +661,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__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),

View File

@ -38,12 +38,15 @@
* 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) \
@ -84,6 +87,42 @@ _GLIBCXX_DEBUG_VERIFY(_First != _Last, \
._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,
@ -145,7 +184,7 @@ _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__foreign_iterator(_Position,_First,_Last),\
* _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)\

View File

@ -0,0 +1,37 @@
// 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;
}

View File

@ -0,0 +1,37 @@
// 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;
}

View File

@ -0,0 +1,41 @@
// 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;
}

View File

@ -0,0 +1,37 @@
// 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;
}

View File

@ -0,0 +1,37 @@
// 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;
}

View File

@ -0,0 +1,43 @@
// 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;
}