From: Jonathan Wakely Date: Wed, 21 Dec 2011 18:35:40 +0000 (+0000) Subject: re PR libstdc++/51626 ([C++0x] can't use C++98 allocators with -std=c++0x) X-Git-Tag: releases/gcc-4.6.3~237 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=718605fc9506fd84f01982d4eb55ec957d101c9f;p=thirdparty%2Fgcc.git re PR libstdc++/51626 ([C++0x] can't use C++98 allocators with -std=c++0x) PR libstdc++/51626 * include/bits/stl_uninitialized.h (_Construct_default_a_impl): Define overloaded functions to conditionally use allocator::construct. (_Construct_default_a): Define to dispatch to appropriate _Construct_default_a_impl overload. (__uninitialized_default_a, __uninitialized_default_n_a): Use _Construct_default_a. * testsuite/20_util/allocator/51626.cc: New. From-SVN: r182600 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 4da64988d4cc..7c3255590be4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2011-12-19 Jonathan Wakely + + PR libstdc++/51626 + * include/bits/stl_uninitialized.h (_Construct_default_a_impl): Define + overloaded functions to conditionally use allocator::construct. + (_Construct_default_a): Define to dispatch to appropriate + _Construct_default_a_impl overload. + (__uninitialized_default_a, __uninitialized_default_n_a): Use + _Construct_default_a. + * testsuite/20_util/allocator/51626.cc: New. + 2011-12-19 Jonathan Wakely * testsuite/ext/type_traits/remove_unsigned_integer_neg.cc: Adjust diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h b/libstdc++-v3/include/bits/stl_uninitialized.h index f15be3aee3b6..70ce545b86ee 100644 --- a/libstdc++-v3/include/bits/stl_uninitialized.h +++ b/libstdc++-v3/include/bits/stl_uninitialized.h @@ -1,7 +1,7 @@ // Raw memory manipulators -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, -// 2009, 2010 +// 2009, 2010, 2011 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -530,6 +530,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __uninit_default_n(__first, __n); } + template + inline auto + _Construct_default_a_impl(_Tp* __ptr, _Allocator& __alloc, void*) + -> decltype(__alloc.construct(__ptr)) + { return __alloc.construct(__ptr); } + + template + inline void + _Construct_default_a_impl(_Tp* __ptr, _Allocator& __alloc, ...) + { _Construct(__ptr); } + + template + inline void + _Construct_default_a(_Tp* __ptr, _Allocator& __alloc) + { _Construct_default_a_impl(__ptr, __alloc, nullptr); } // __uninitialized_default_a // Fills [first, last) with std::distance(first, last) default @@ -544,7 +559,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __try { for (; __cur != __last; ++__cur) - __alloc.construct(std::__addressof(*__cur)); + _Construct_default_a(std::__addressof(*__cur), __alloc); } __catch(...) { @@ -573,7 +588,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __try { for (; __n > 0; --__n, ++__cur) - __alloc.construct(std::__addressof(*__cur)); + _Construct_default_a(std::__addressof(*__cur), __alloc); } __catch(...) { diff --git a/libstdc++-v3/testsuite/20_util/allocator/51626.cc b/libstdc++-v3/testsuite/20_util/allocator/51626.cc new file mode 100644 index 000000000000..951aa18fef44 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/allocator/51626.cc @@ -0,0 +1,66 @@ +// 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 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 +// . + +// { dg-options "-std=gnu++0x" } + +#include +#include +#include + +int count = 0; + +template + struct allocator98 : std::allocator + { + template struct rebind { typedef allocator98 other; }; + + allocator98() { } + + template allocator98(const allocator98&) { }; + + void construct(T* p, const T& val) + { + ++count; + std::allocator::construct(p, val); + } + }; + +template + struct allocator11 : std::allocator + { + template struct rebind { typedef allocator11 other; }; + + allocator11() { } + + template allocator11(const allocator11&) { }; + + template + void construct(T* p, Args&&... args) + { + ++count; + std::allocator::construct(p, std::forward(args)...); + } + }; + +int main() +{ + std::vector< int, allocator98 > v98(1); + VERIFY( count == 0 ); + + std::vector< int, allocator11 > v11(1); + VERIFY( count == 1 ); +}