re PR libstdc++/50119 ([C++0x] copy_n advances InputIterator one more time than necessary)

2011-08-18  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/50119
	* include/bits/stl_algo.h (__copy_n(_InputIterator, _Size,
	_OutputIterator, input_iterator_tag)): Fix.
	* testsuite/25_algorithms/copy_n/50119.cc: New.

From-SVN: r177871
This commit is contained in:
Paolo Carlini 2011-08-18 16:32:23 +00:00
parent df385b9c2b
commit 6ba30237b9
3 changed files with 70 additions and 5 deletions

View File

@ -1,7 +1,14 @@
2011-08-18 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/50119
* include/bits/stl_algo.h (__copy_n(_InputIterator, _Size,
_OutputIterator, input_iterator_tag)): Fix.
* testsuite/25_algorithms/copy_n/50119.cc: New.
2011-08-18 Marc Glisse <marc.glisse@normalesup.org>
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR libstdc++-v3/1773
PR libstdc++/1773
* config/os/solaris2.7: Rename to config/os/solaris2.9.
* config/os/solaris/solaris2.9/os_defines.h
(__CORRECT_ISO_CPP_MATH_H_PROTO1)

View File

@ -979,11 +979,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__copy_n(_InputIterator __first, _Size __n,
_OutputIterator __result, input_iterator_tag)
{
for (; __n > 0; --__n)
if (__n > 0)
{
*__result = *__first;
++__first;
++__result;
while (true)
{
*__result = *__first;
++__result;
if (--__n > 0)
++__first;
else
break;
}
}
return __result;
}

View File

@ -0,0 +1,52 @@
// { dg-options "-std=gnu++0x" }
// Copyright (C) 2011 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 <algorithm>
#include <vector>
#include <sstream>
#include <iterator>
#include <testsuite_hooks.h>
// libstdc++/50119
void test01()
{
using namespace std;
bool test __attribute__((unused)) = true;
vector<int> v;
istringstream s("1 2 3 4 5");
copy_n(istream_iterator<int>(s), 2, back_inserter(v));
VERIFY( v.size() == 2 );
VERIFY( v[0] == 1 );
VERIFY( v[1] == 2 );
copy_n(istream_iterator<int>(s), 2, back_inserter(v));
VERIFY( v.size() == 4 );
VERIFY( v[0] == 1 );
VERIFY( v[1] == 2 );
VERIFY( v[2] == 3 );
VERIFY( v[3] == 4 );
}
int main()
{
test01();
return 0;
}