From 8f407473acd4c8eb119704f4fec30a6ed130fdb7 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 17 Oct 2006 15:17:32 +0000 Subject: [PATCH] re PR libstdc++/26020 (std::advance() isn't stable for floating point numbers) 2006-10-17 Paolo Carlini PR libstdc++/26020 * include/bits/stl_iterator_base_funcs.h (advance): Convert distance parameter to iterator_traits<>::difference_type. * testsuite/24_iterators/26020.cc: New. From-SVN: r117827 --- libstdc++-v3/ChangeLog | 7 +++ .../include/bits/stl_iterator_base_funcs.h | 8 ++-- libstdc++-v3/testsuite/24_iterators/26020.cc | 45 +++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 libstdc++-v3/testsuite/24_iterators/26020.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 45dc5b76852..ac94e35f9d8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2006-10-17 Paolo Carlini + + PR libstdc++/26020 + * include/bits/stl_iterator_base_funcs.h (advance): Convert + distance parameter to iterator_traits<>::difference_type. + * testsuite/24_iterators/26020.cc: New. + 2006-10-17 Benjamin Kosnik * include/tr1/random.tcc: Fixup long line. diff --git a/libstdc++-v3/include/bits/stl_iterator_base_funcs.h b/libstdc++-v3/include/bits/stl_iterator_base_funcs.h index 82bf040afb2..79fb6675fa2 100644 --- a/libstdc++-v3/include/bits/stl_iterator_base_funcs.h +++ b/libstdc++-v3/include/bits/stl_iterator_base_funcs.h @@ -1,6 +1,7 @@ // Functions used by iterators -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 +// 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 @@ -131,7 +132,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) template inline void __advance(_BidirectionalIterator& __i, _Distance __n, - bidirectional_iterator_tag) + bidirectional_iterator_tag) { // concept requirements __glibcxx_function_requires(_BidirectionalIteratorConcept< @@ -172,7 +173,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) advance(_InputIterator& __i, _Distance __n) { // concept requirements -- taken care of in __advance - std::__advance(__i, __n, std::__iterator_category(__i)); + typename iterator_traits<_InputIterator>::difference_type __d = __n; + std::__advance(__i, __d, std::__iterator_category(__i)); } _GLIBCXX_END_NAMESPACE diff --git a/libstdc++-v3/testsuite/24_iterators/26020.cc b/libstdc++-v3/testsuite/24_iterators/26020.cc new file mode 100644 index 00000000000..80c4e715d1b --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/26020.cc @@ -0,0 +1,45 @@ +// Copyright (C) 2006 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 24.3.4 Iterator operations + +#include +#include +#include + +//libstdc++/26020 +void test01() +{ + using namespace std; + bool test __attribute__((unused)) = true; + + list ll; + ll.push_back(1); + + list::iterator it(ll.begin()); + + advance(it, 0.5); + + VERIFY( it == ll.begin() ); +} + +int main() +{ + test01(); + return 0; +} -- 2.30.2