OSDN Git Service

2010-03-04 Paolo Carlini <paolo.carlini@oracle.com>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Mar 2010 01:51:56 +0000 (01:51 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Mar 2010 01:51:56 +0000 (01:51 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157239 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/throw_allocator.h
libstdc++-v3/testsuite/23_containers/deque/requirements/exception/generation_prohibited.cc
libstdc++-v3/testsuite/23_containers/vector/requirements/exception/generation_prohibited.cc
libstdc++-v3/testsuite/util/exception/safety.h
libstdc++-v3/testsuite/util/testsuite_container_traits.h

index c97dbf0..c677c05 100644 (file)
@@ -1,3 +1,34 @@
+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.
index f2e7553..48089bd 100644 (file)
@@ -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<std::size_t> 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<std::size_t> h;
        size_t __result = h(__val._M_i);
index 23cde13..aa3a8ba 100644 (file)
@@ -1,10 +1,9 @@
 // { 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
index 1339280..acd2c21 100644 (file)
@@ -1,10 +1,9 @@
 // { 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
index 2bd1ed9..a17b755 100644 (file)
@@ -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<container_type>::has_throwing_erase::value)
+           {
+             _M_erasep(_M_container);
+             _M_eraser(_M_container);
+           }
 
          _M_popf(_M_container);
          _M_popb(_M_container);
index 7893843..d6be444 100644 (file)
@@ -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<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
@@ -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