re PR libstdc++/25306 (fill_n, generate_n assume Size is modifiable)

2010-05-21  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/25306
	* include/bits/stl_algobase.h (fill_n): Use a properly typed __niter
	initialized to __n.
	* include/bits/stl_algo.h (generate_n): Likewise.
	* testsuite/25_algorithms/fill_n/25306.cc: New.
	* testsuite/25_algorithms/generate_n/25306.cc: Likewise.

From-SVN: r159677
This commit is contained in:
Paolo Carlini 2010-05-21 16:57:17 +00:00 committed by Paolo Carlini
parent bdc89f9eff
commit 759149fbf3
5 changed files with 75 additions and 3 deletions

View File

@ -1,3 +1,12 @@
2010-05-21 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/25306
* include/bits/stl_algobase.h (fill_n): Use a properly typed __niter
initialized to __n.
* include/bits/stl_algo.h (generate_n): Likewise.
* testsuite/25_algorithms/fill_n/25306.cc: New.
* testsuite/25_algorithms/generate_n/25306.cc: Likewise.
2010-05-21 Joseph Myers <joseph@codesourcery.com>
* acinclude.m4 (GLIBCXX_ENABLE_CLOCALE): Use GNU locale model for

View File

@ -4844,7 +4844,8 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P)
// "the type returned by a _Generator"
__typeof__(__gen())>)
for (; __n > 0; --__n, ++__first)
for (__decltype(__n + 0) __niter = __n;
__niter > 0; --__niter, ++__first)
*__first = __gen();
return __first;
}

View File

@ -748,7 +748,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
__gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type
__fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
{
for (; __n > 0; --__n, ++__first)
for (__decltype(__n + 0) __niter = __n;
__niter > 0; --__niter, ++__first)
*__first = __value;
return __first;
}
@ -759,7 +760,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
__fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
{
const _Tp __tmp = __value;
for (; __n > 0; --__n, ++__first)
for (__decltype(__n + 0) __niter = __n;
__niter > 0; --__niter, ++__first)
*__first = __tmp;
return __first;
}

View File

@ -0,0 +1,30 @@
// { dg-do compile }
// Copyright (C) 2010 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/>.
#include <algorithm>
struct Size
{
operator int() { return 0; }
private:
void operator=(Size&);
};
// libstdc++/25306
template int* std::fill_n(int*, Size, const int&);

View File

@ -0,0 +1,30 @@
// { dg-do compile }
// Copyright (C) 2010 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/>.
#include <algorithm>
struct Size
{
operator int() { return 0; }
private:
void operator=(Size&);
};
// libstdc++/25306
template int* std::generate_n(int*, Size, int (*)());