diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c97dbf074f9..c677c05b3ed 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,34 @@ +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. + 2010-03-03 Benjamin Kosnik * doc/Makefile.am: Re-organize xml sources. diff --git a/libstdc++-v3/include/ext/throw_allocator.h b/libstdc++-v3/include/ext/throw_allocator.h index f2e7553099d..48089bd7dd0 100644 --- a/libstdc++-v3/include/ext/throw_allocator.h +++ b/libstdc++-v3/include/ext/throw_allocator.h @@ -1,6 +1,7 @@ // -*- C++ -*- -// Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 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 @@ -728,7 +729,7 @@ namespace std : public std::unary_function<__gnu_cxx::throw_value_limit, size_t> { size_t - operator()(__gnu_cxx::throw_value_limit __val) const + operator()(const __gnu_cxx::throw_value_limit& __val) const { std::hash h; size_t __result = h(__val._M_i); @@ -742,7 +743,7 @@ namespace std : public std::unary_function<__gnu_cxx::throw_value_random, size_t> { size_t - operator()(__gnu_cxx::throw_value_random __val) const + operator()(const __gnu_cxx::throw_value_random& __val) const { std::hash h; size_t __result = h(__val._M_i); diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/exception/generation_prohibited.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/exception/generation_prohibited.cc index 23cde13f4df..aa3a8ba87f7 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/exception/generation_prohibited.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/exception/generation_prohibited.cc @@ -1,10 +1,9 @@ // { dg-options "-std=gnu++0x" } // { dg-require-cstdint "" } -// { dg-do run { xfail *-*-* } } // 2009-09-09 Benjamin Kosnik -// Copyright (C) 2009 Free Software Foundation, Inc. +// Copyright (C) 2009, 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 diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/exception/generation_prohibited.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/exception/generation_prohibited.cc index 133928040dd..acd2c211d5a 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/exception/generation_prohibited.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/exception/generation_prohibited.cc @@ -1,10 +1,9 @@ // { dg-options "-std=gnu++0x" } // { dg-require-cstdint "" } -// { dg-do run { xfail *-*-* } } // 2009-09-09 Benjamin Kosnik -// Copyright (C) 2009 Free Software Foundation, Inc. +// Copyright (C) 2009, 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 diff --git a/libstdc++-v3/testsuite/util/exception/safety.h b/libstdc++-v3/testsuite/util/exception/safety.h index 2bd1ed96993..a17b755ce52 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 789384336bf..d6be4440b0a 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