diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-21 16:57:17 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-21 16:57:17 +0000 |
commit | 6ec4f2a349652f65572581028598fb0cdaa0d3c7 (patch) | |
tree | 759716ca467179a6c260bd41e88fbf2bb7ecd570 | |
parent | a8b6351694e817433e38a4d4c2e0faf81f0cb6b8 (diff) | |
download | gcc-6ec4f2a349652f65572581028598fb0cdaa0d3c7.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159677 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_algo.h | 3 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_algobase.h | 6 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/fill_n/25306.cc | 30 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/generate_n/25306.cc | 30 |
5 files changed, 75 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1eb3a31594f..82d13dafd64 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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 diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h index 5b4991e33b6..fe2edb9c8da 100644 --- a/libstdc++-v3/include/bits/stl_algo.h +++ b/libstdc++-v3/include/bits/stl_algo.h @@ -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; } diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index e92540431de..0489c413b95 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -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; } diff --git a/libstdc++-v3/testsuite/25_algorithms/fill_n/25306.cc b/libstdc++-v3/testsuite/25_algorithms/fill_n/25306.cc new file mode 100644 index 00000000000..37ccd7c36e8 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/fill_n/25306.cc @@ -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&); diff --git a/libstdc++-v3/testsuite/25_algorithms/generate_n/25306.cc b/libstdc++-v3/testsuite/25_algorithms/generate_n/25306.cc new file mode 100644 index 00000000000..f73ff3d778e --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/generate_n/25306.cc @@ -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 (*)()); |