From ccd04b9f89c5adafd11300a09a5554f9a4b28f2e Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 7 Sep 2007 01:37:31 +0000 Subject: [PATCH] stl_vector.h (_Vector_base<>::_M_allocate): Do not call _M_impl.allocate when __n == 0. 2007-09-06 Paolo Carlini * include/bits/stl_vector.h (_Vector_base<>::_M_allocate): Do not call _M_impl.allocate when __n == 0. * testsuite/23_containers/vector/zero_sized_allocations.cc: New. From-SVN: r128220 --- libstdc++-v3/ChangeLog | 6 ++ libstdc++-v3/include/bits/stl_vector.h | 2 +- .../23_containers/vector/zero_sized_allocations.cc | 77 ++++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/23_containers/vector/zero_sized_allocations.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 15de4ea..2e618c3 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2007-09-06 Paolo Carlini + + * include/bits/stl_vector.h (_Vector_base<>::_M_allocate): + Do not call _M_impl.allocate when __n == 0. + * testsuite/23_containers/vector/zero_sized_allocations.cc: New. + 2007-09-06 Matthias Klose * testsuite/27_io/headers/cstdlib: Remove empty directory. diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index c294f4e..a942a37 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -125,7 +125,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) _Tp* _M_allocate(size_t __n) - { return _M_impl.allocate(__n); } + { return __n != 0 ? _M_impl.allocate(__n) : 0; } void _M_deallocate(_Tp* __p, size_t __n) diff --git a/libstdc++-v3/testsuite/23_containers/vector/zero_sized_allocations.cc b/libstdc++-v3/testsuite/23_containers/vector/zero_sized_allocations.cc new file mode 100644 index 0000000..2b31267 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/zero_sized_allocations.cc @@ -0,0 +1,77 @@ +// Copyright (C) 2007 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. +// +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include +#include +#include + +unsigned int zero_sized_news = 0; + +void *operator new(size_t size) throw (std::bad_alloc) +{ + /* malloc(0) is unpredictable; avoid it. */ + if (size == 0) + { + size = 1; + ++zero_sized_news; + } + + void *p = std::malloc(size); + + if (p == 0) + throw std::bad_alloc(); + + return p; +} + +void operator delete(void *ptr) throw() +{ + if (ptr != 0) + std::free(ptr); +} + +// http://gcc.gnu.org/ml/libstdc++/2007-09/msg00006.html +void test01() +{ + bool test __attribute__((unused)) = true; + + std::vector > *v; + VERIFY( zero_sized_news == 0 ); + + v = new std::vector >; + VERIFY( zero_sized_news == 0 ); + + v->resize(10); + delete(v); + VERIFY( zero_sized_news == 0 ); +} + +int main() +{ + test01(); + return 0; +} -- 2.7.4