+2010-03-04 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * testsuite/util/testsuite_container_traits.h (traits_base): Add
+ has_throwing_erase trait.
+ (traits<vector>, traits<deque>): 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<map>,
+ traits<multimap>, traits<set>, traits<multiset>,
+ traits<unordered_map>, traits<unordered_multimap>,
+ traits<unordered_set>, traits<unordered_multiset>): Typedef
+ consistently has_erase and has_insert as true_type.
+
+ * testsuite/util/testsuite_container_traits.h
+ (traits<unordered_map>, traits<unordered_multimap>,
+ traits<unordered_set>, traits<unordered_multiset>): 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 <bkoz@redhat.com>
* doc/Makefile.am: Re-organize xml sources.
// -*- 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
: 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<std::size_t> h;
size_t __result = h(__val._M_i);
: 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<std::size_t> h;
size_t __result = h(__val._M_i);
// { dg-options "-std=gnu++0x" }
// { dg-require-cstdint "" }
-// { dg-do run { xfail *-*-* } }
// 2009-09-09 Benjamin Kosnik <benjamin@redhat.com>
-// 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
// { dg-options "-std=gnu++0x" }
// { dg-require-cstdint "" }
-// { dg-do run { xfail *-*-* } }
// 2009-09-09 Benjamin Kosnik <benjamin@redhat.com>
-// 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
{
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<container_type>::has_throwing_erase::value)
+ {
+ _M_erasep(_M_container);
+ _M_eraser(_M_container);
+ }
_M_popf(_M_container);
_M_popb(_M_container);
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;
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;
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;
};
typedef std::true_type is_associative;
typedef std::true_type is_mapped;
+ typedef std::true_type has_erase;
typedef std::true_type has_insert;
};
typedef std::true_type is_associative;
typedef std::true_type is_mapped;
+ typedef std::true_type has_erase;
typedef std::true_type has_insert;
};
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;
};
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;
};
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;
};
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<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
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;
};
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