diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 42ea0b3d326..23908a25dcb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,19 @@ +2010-09-27 Paolo Carlini + + * include/bits/allocator.h (allocator_arg_t, allocator_arg, + uses_allocator): Add. + * testsuite/20_util/uses_allocator/value.cc: New. + * testsuite/20_util/uses_allocator/requirements/typedefs.cc: Likewise. + * testsuite/20_util/uses_allocator/requirements/ + explicit_instantiation.cc: Likewise. + * include/bits/stl_queue.h (uses_allocator, + uses_allocator): Add. + * include/bits/stl_stack.h (uses_allocator): Likewise. + + * include/bits/stl_pair.h (piecewise_construct): Add. + * testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Adjust dg-error + line number. + 2010-09-27 Paolo Carlini * include/c_std/cmath (__pow_helper): Remove. diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h index ddf48db4cc2..2d7a4e129ac 100644 --- a/libstdc++-v3/include/bits/allocator.h +++ b/libstdc++-v3/include/bits/allocator.h @@ -47,6 +47,10 @@ // Define the base class to std::allocator. #include +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +#include +#endif + _GLIBCXX_BEGIN_NAMESPACE(std) /** @@ -177,28 +181,71 @@ _GLIBCXX_BEGIN_NAMESPACE(std) }; #ifdef __GXX_EXPERIMENTAL_CXX0X__ - // A very basic implementation for now. In general we have to wait for - // the availability of the infrastructure described in N2983: we should - // try when either T has a move constructor which cannot throw or T is - // CopyContructible. - // NB: This code doesn't properly belong here, we should find a more - // suited place common to std::vector and std::deque. - template - struct __shrink_to_fit - { static void _S_do_it(_Tp&) { } }; + // A very basic implementation for now. In general we have to wait for + // the availability of the infrastructure described in N2983: we should + // try when either T has a move constructor which cannot throw or T is + // CopyContructible. + // NB: This code doesn't properly belong here, we should find a more + // suited place common to std::vector and std::deque. + template + struct __shrink_to_fit + { static void _S_do_it(_Tp&) { } }; + + template + struct __shrink_to_fit<_Tp, true> + { + static void + _S_do_it(_Tp& __v) + { + __try + { _Tp(__v).swap(__v); } + __catch(...) { } + } + }; + + + /// [allocator.tag] + struct allocator_arg_t { }; + + static const allocator_arg_t allocator_arg = allocator_arg_t(); + + template + class __has_allocator_type + : public __sfinae_types + { + template + struct _Wrap_type + { }; + + template + static __one __test(_Wrap_type*); + + template + static __two __test(...); + + public: + static const bool __value = sizeof(__test<_Tp>(0)) == 1; + }; + + template::__value> + struct __uses_allocator_helper + : public false_type { }; + + template + struct __uses_allocator_helper<_Tp, _Alloc, true> + : public integral_constant::value> + { }; + + /// [allocator.uses.trait] + template + struct uses_allocator + : public integral_constant::value> + { }; - template - struct __shrink_to_fit<_Tp, true> - { - static void - _S_do_it(_Tp& __v) - { - __try - { _Tp(__v).swap(__v); } - __catch(...) { } - } - }; #endif _GLIBCXX_END_NAMESPACE diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h index c5f2986fb77..f4b339db91a 100644 --- a/libstdc++-v3/include/bits/stl_pair.h +++ b/libstdc++-v3/include/bits/stl_pair.h @@ -68,6 +68,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) #ifdef __GXX_EXPERIMENTAL_CXX0X__ struct piecewise_construct_t { }; + static const piecewise_construct_t piecewise_construct + = piecewise_construct_t(); + // forward declarations template class tuple; diff --git a/libstdc++-v3/include/bits/stl_queue.h b/libstdc++-v3/include/bits/stl_queue.h index 96e29ed636e..85a06abe12f 100644 --- a/libstdc++-v3/include/bits/stl_queue.h +++ b/libstdc++-v3/include/bits/stl_queue.h @@ -307,6 +307,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) inline void swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y) { __x.swap(__y); } + + template + struct uses_allocator, _Alloc> + : public uses_allocator<_Seq, _Alloc>::type { }; #endif /** @@ -536,6 +540,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) swap(priority_queue<_Tp, _Sequence, _Compare>& __x, priority_queue<_Tp, _Sequence, _Compare>& __y) { __x.swap(__y); } + + template + struct uses_allocator, _Alloc> + : public uses_allocator<_Sequence, _Alloc>::type { }; #endif _GLIBCXX_END_NAMESPACE diff --git a/libstdc++-v3/include/bits/stl_stack.h b/libstdc++-v3/include/bits/stl_stack.h index 26f50ad66f8..7312a35e9de 100644 --- a/libstdc++-v3/include/bits/stl_stack.h +++ b/libstdc++-v3/include/bits/stl_stack.h @@ -282,6 +282,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) inline void swap(stack<_Tp, _Seq>& __x, stack<_Tp, _Seq>& __y) { __x.swap(__y); } + + template + struct uses_allocator, _Alloc> + : public uses_allocator<_Seq, _Alloc>::type { }; #endif _GLIBCXX_END_NAMESPACE diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/requirements/explicit_instantiation.cc new file mode 100644 index 00000000000..5a43088c42c --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/requirements/explicit_instantiation.cc @@ -0,0 +1,29 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2010-09-27 Paolo Carlini + +// 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 + +namespace std +{ + typedef short test_type; + template struct uses_allocator; +} diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/requirements/typedefs.cc new file mode 100644 index 00000000000..fad654d590c --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/requirements/typedefs.cc @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2010-09-27 Paolo Carlini +// +// 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 + +void test01() +{ + // Check for required typedefs + typedef std::uses_allocator test_type; + typedef test_type::value_type value_type; + typedef test_type::type type; + typedef test_type::type::value_type type_value_type; + typedef test_type::type::type type_type; +} diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/value.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/value.cc new file mode 100644 index 00000000000..5a7b0a8daf1 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/value.cc @@ -0,0 +1,59 @@ +// { dg-options "-std=gnu++0x" } + +// 2010-09-27 Paolo Carlini + +// 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 +#include +#include + +struct MyAlloc { }; + +struct MyDerivedAlloc +: public MyAlloc { }; + +struct UA { }; + +struct UB { typedef int allocator_type; }; + +struct UC { typedef MyAlloc allocator_type; }; + +struct UD { typedef MyDerivedAlloc allocator_type; }; + +void test01() +{ + bool test __attribute__((unused)) = true; + using std::uses_allocator; + using namespace __gnu_test; + + // Positive tests. + VERIFY( (test_relationship(true)) ); + VERIFY( (test_relationship(true))); + + // Negative tests. + VERIFY( (test_relationship(false)) ); + VERIFY( (test_relationship(false)) ); + VERIFY( (test_relationship(false)) ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc b/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc index f124718016e..fbb24c002f4 100644 --- a/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc +++ b/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc @@ -48,4 +48,4 @@ main() // { dg-warning "note" "" { target *-*-* } 1027 } // { dg-warning "note" "" { target *-*-* } 340 } // { dg-warning "note" "" { target *-*-* } 290 } -// { dg-warning "note" "" { target *-*-* } 197 } +// { dg-warning "note" "" { target *-*-* } 200 }