From 714902c8d41b98d1254a17cae94d9192ee8c7d82 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 5 Mar 2010 01:51:56 +0000 Subject: testsuite_container_traits.h (traits_base): Add has_throwing_erase trait. 2010-03-04 Paolo Carlini * testsuite/util/testsuite_container_traits.h (traits_base): Add has_throwing_erase trait. (traits, traits): Typedef the latter to true_type. * testsuite/util/exception/safety.h (generation_prohibited): Do not test vector::erase and deque::erase: can throw if either copy constructor or assignment operator of value_type throws. * testsuite/23_containers/vector/requirements/exception/ generation_prohibited.cc: Remove xfail. * testsuite/23_containers/deque/requirements/exception/ generation_prohibited.cc: Likewise. * include/ext/throw_allocator.h (hash<__gnu_cxx::throw_value_limit>:: operator(), hash<__gnu_cxx::throw_value_random>::operator()): Pass argument by const ref. * testsuite/util/testsuite_container_traits.h (traits, traits, traits, traits, traits, traits, traits, traits): Typedef consistently has_erase and has_insert as true_type. * testsuite/util/testsuite_container_traits.h (traits, traits, traits, traits): Do not wrongly typedef has_size_type_constructor as true_type: the constructor accepting a size_type actually gets the initial number of buckets. From-SVN: r157239 --- libstdc++-v3/testsuite/util/exception/safety.h | 9 +++++++-- libstdc++-v3/testsuite/util/testsuite_container_traits.h | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'libstdc++-v3/testsuite/util') diff --git a/libstdc++-v3/testsuite/util/exception/safety.h b/libstdc++-v3/testsuite/util/exception/safety.h index 2bd1ed9..a17b755 100644 --- a/libstdc++-v3/testsuite/util/exception/safety.h +++ b/libstdc++-v3/testsuite/util/exception/safety.h @@ -1096,8 +1096,13 @@ namespace __gnu_test { condition_type::always_adjustor on; - _M_erasep(_M_container); - _M_eraser(_M_container); + // NB: Vector and deque are special, erase can throw if the copy + // constructor or assignment operator of value_type throws. + if (!traits::has_throwing_erase::value) + { + _M_erasep(_M_container); + _M_eraser(_M_container); + } _M_popf(_M_container); _M_popb(_M_container); diff --git a/libstdc++-v3/testsuite/util/testsuite_container_traits.h b/libstdc++-v3/testsuite/util/testsuite_container_traits.h index 7893843..d6be444 100644 --- a/libstdc++-v3/testsuite/util/testsuite_container_traits.h +++ b/libstdc++-v3/testsuite/util/testsuite_container_traits.h @@ -39,6 +39,7 @@ namespace __gnu_test typedef std::false_type is_mapped; typedef std::false_type has_erase; + typedef std::false_type has_throwing_erase; typedef std::false_type has_insert; typedef std::false_type has_push_pop; typedef std::false_type has_size_type_constructor; @@ -65,6 +66,7 @@ namespace __gnu_test typedef std::true_type is_allocator_aware; typedef std::true_type has_erase; + typedef std::true_type has_throwing_erase; typedef std::true_type has_insert; typedef std::true_type has_push_pop; typedef std::true_type has_size_type_constructor; @@ -103,6 +105,7 @@ namespace __gnu_test typedef std::true_type is_allocator_aware; typedef std::true_type has_erase; + typedef std::true_type has_throwing_erase; typedef std::true_type has_insert; typedef std::true_type has_size_type_constructor; }; @@ -140,6 +143,7 @@ namespace __gnu_test typedef std::true_type is_associative; typedef std::true_type is_mapped; + typedef std::true_type has_erase; typedef std::true_type has_insert; }; @@ -152,6 +156,7 @@ namespace __gnu_test typedef std::true_type is_associative; typedef std::true_type is_mapped; + typedef std::true_type has_erase; typedef std::true_type has_insert; }; @@ -163,6 +168,7 @@ namespace __gnu_test typedef std::true_type is_allocator_aware; typedef std::true_type is_associative; + typedef std::true_type has_erase; typedef std::true_type has_insert; }; @@ -174,6 +180,7 @@ namespace __gnu_test typedef std::true_type is_allocator_aware; typedef std::true_type is_associative; + typedef std::true_type has_erase; typedef std::true_type has_insert; }; @@ -205,7 +212,7 @@ namespace __gnu_test typedef std::true_type is_unordered; typedef std::true_type is_mapped; - typedef std::true_type has_size_type_constructor; + typedef std::true_type has_erase; typedef std::true_type has_insert; }; @@ -219,7 +226,8 @@ namespace __gnu_test typedef std::true_type is_unordered; typedef std::true_type is_mapped; - typedef std::true_type has_size_type_constructor; + typedef std::true_type has_erase; + typedef std::true_type has_insert; }; template @@ -230,7 +238,7 @@ namespace __gnu_test typedef std::true_type is_allocator_aware; typedef std::true_type is_unordered; - typedef std::true_type has_size_type_constructor; + typedef std::true_type has_erase; typedef std::true_type has_insert; }; @@ -242,7 +250,7 @@ namespace __gnu_test typedef std::true_type is_allocator_aware; typedef std::true_type is_unordered; - typedef std::true_type has_size_type_constructor; + typedef std::true_type has_erase; typedef std::true_type has_insert; }; } // namespace __gnu_test -- cgit v1.1