diff options
author | Jonathan Wakely <jwakely.gcc@gmail.com> | 2011-06-11 16:05:08 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2011-06-11 17:05:08 +0100 |
commit | c51b58dc1f298bc8255758a51e94d5b7478b56ab (patch) | |
tree | 447dd60007e928ad8f52ed863e1e46067492b948 | |
parent | a9a76bae8bc5f7d9f73acca95a55bd46c873e65b (diff) | |
download | gcc-c51b58dc1f298bc8255758a51e94d5b7478b56ab.zip gcc-c51b58dc1f298bc8255758a51e94d5b7478b56ab.tar.gz gcc-c51b58dc1f298bc8255758a51e94d5b7478b56ab.tar.bz2 |
extptr_allocator.h (construct, destroy): Fix for C++0x mode by overloading to take allocator's pointer type.
2011-06-11 Jonathan Wakely <jwakely.gcc@gmail.com>
* include/ext/extptr_allocator.h (construct, destroy): Fix for C++0x
mode by overloading to take allocator's pointer type.
* testsuite/23_containers/vector/ext_pointer/types/2.cc: New.
* testsuite/23_containers/vector/ext_pointer/explicit_instantiation/
2.cc: New.
From-SVN: r174958
4 files changed, 108 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index fd39e4a..3308723 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2011-06-11 Jonathan Wakely <jwakely.gcc@gmail.com> + * include/ext/extptr_allocator.h (construct, destroy): Fix for C++0x + mode by overloading to take allocator's pointer type. + * testsuite/23_containers/vector/ext_pointer/types/2.cc: New. + * testsuite/23_containers/vector/ext_pointer/explicit_instantiation/ + 2.cc: New. + +2011-06-11 Jonathan Wakely <jwakely.gcc@gmail.com> + * testsuite/20_util/allocator_traits/requirements/ explicit_instantiation.cc: Add another instantiation. diff --git a/libstdc++-v3/include/ext/extptr_allocator.h b/libstdc++-v3/include/ext/extptr_allocator.h index 96aea72..21b1282 100644 --- a/libstdc++-v3/include/ext/extptr_allocator.h +++ b/libstdc++-v3/include/ext/extptr_allocator.h @@ -107,10 +107,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION construct(_Up* __p, _Args&&... __args) { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } + template<typename... _Args> + void + construct(pointer __p, _Args&&... __args) + { construct(__p.get(), std::forward<_Args>(__args)...); } + template<typename _Up> void destroy(_Up* __p) { __p->~_Up(); } + + void destroy(pointer __p) + { destroy(__p.get()); } + #else void construct(pointer __p, const _Tp& __val) diff --git a/libstdc++-v3/testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc b/libstdc++-v3/testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc new file mode 100644 index 0000000..974f2c4 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc @@ -0,0 +1,28 @@ +// Test for Container using non-standard pointer types. + +// 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 +// <http://www.gnu.org/licenses/>. + + +#include <vector> +#include <ext/extptr_allocator.h> + +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template class std::vector<int, __gnu_cxx::_ExtPtr_allocator<int> >; diff --git a/libstdc++-v3/testsuite/23_containers/vector/ext_pointer/types/2.cc b/libstdc++-v3/testsuite/23_containers/vector/ext_pointer/types/2.cc new file mode 100644 index 0000000..929e7d5 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/ext_pointer/types/2.cc @@ -0,0 +1,63 @@ +// Test for Container using non-standard pointer types. + +// 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 +// <http://www.gnu.org/licenses/>. + + +// { dg-options "-std=gnu++0x" } + +// This is a copy of vector/types/1.cc with altered allocator. +// The operator+()s in this test initially failed the test - +// they stress the accurate recognition, by the compiler, +// of _Pointer_adapter's own pointer arithmetic functions, +// which have to match perfectly on the int type to get +// chosen by the compiler when it sees: _Pointer_adapter<T> + int, etc. + +#include <vector> +#include <ext/extptr_allocator.h> + +namespace N +{ + struct X { }; + + template<typename T> + X operator+(T, std::size_t) + { return X(); } + + template<typename T> + X operator-(T, T) + { return X(); } +} + +int main() +{ + std::vector<N::X, __gnu_cxx::_ExtPtr_allocator<N::X> > v(5); + const std::vector<N::X, __gnu_cxx::_ExtPtr_allocator<N::X> > w(1); + + v[0]; + w[0]; + v.size(); + v.capacity(); + v.resize(1); + v.insert(v.begin(), N::X()); + v.insert(v.begin(), 1, N::X()); + v.insert(v.begin(), w.begin(), w.end()); + v = w; + + return 0; +} |