From 6ec4f2a349652f65572581028598fb0cdaa0d3c7 Mon Sep 17 00:00:00 2001 From: paolo Date: Fri, 21 May 2010 16:57:17 +0000 Subject: [PATCH 1/1] 2010-05-21 Paolo Carlini 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 --- libstdc++-v3/ChangeLog | 9 +++++++ libstdc++-v3/include/bits/stl_algo.h | 3 ++- libstdc++-v3/include/bits/stl_algobase.h | 6 +++-- .../testsuite/25_algorithms/fill_n/25306.cc | 30 ++++++++++++++++++++++ .../testsuite/25_algorithms/generate_n/25306.cc | 30 ++++++++++++++++++++++ 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 libstdc++-v3/testsuite/25_algorithms/fill_n/25306.cc create mode 100644 libstdc++-v3/testsuite/25_algorithms/generate_n/25306.cc 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 + + 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 * 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::__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 +// . + +#include + +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 +// . + +#include + +struct Size +{ + operator int() { return 0; } +private: + void operator=(Size&); +}; + +// libstdc++/25306 +template int* std::generate_n(int*, Size, int (*)()); -- 2.11.0