]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
debug.html: Users are allowed to specialize in namespace __gnu_debug...
authorDouglas Gregor <gregod@cs.rpi.edu>
Fri, 14 Nov 2003 00:15:00 +0000 (00:15 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Fri, 14 Nov 2003 00:15:00 +0000 (00:15 +0000)
2003-11-13  Douglas Gregor  <gregod@cs.rpi.edu>

* docs/html/debug.html: Users are allowed to specialize in
namespace __gnu_debug, unlike in the Apple version of the debug
mode. Clear up a confusing double-negative. Note that
std::basic_string does provide extra debugging capabilities, but
not safe iterators.
* include/bits/basic_string.tcc: Make sure there's never an
ambiguity when calling __is_null_pointer.
* include/debug/deque: (deque::erase) Properly handle invalidation
when erasing at the end of the deque.
* include/debug/vector: (vector::swap): Swap _M_guaranteed_capacity.
(vector::clear): Set the guaranteed capacity to 0.
* testsuite/23_containers/deque/invalidation/4.cc: (test04): Test
iterator invalidation when erasing at the end of the deque.

From-SVN: r73564

libstdc++-v3/ChangeLog
libstdc++-v3/docs/html/debug.html
libstdc++-v3/docs/html/debug_mode.html
libstdc++-v3/include/bits/basic_string.tcc
libstdc++-v3/include/debug/deque
libstdc++-v3/include/debug/vector
libstdc++-v3/testsuite/23_containers/deque/invalidation/4.cc

index 7d84d46fb864b5d60674722f0d210fc525f23a16..8ebb98a572142e3fec3ae4b5b5b3ace3c9db3eba 100644 (file)
@@ -1,3 +1,19 @@
+2003-11-13  Douglas Gregor  <gregod@cs.rpi.edu>
+
+       * docs/html/debug.html: Users are allowed to specialize in
+       namespace __gnu_debug, unlike in the Apple version of the debug
+       mode. Clear up a confusing double-negative. Note that
+       std::basic_string does provide extra debugging capabilities, but
+       not safe iterators.
+       * include/bits/basic_string.tcc: Make sure there's never an
+       ambiguity when calling __is_null_pointer. 
+       * include/debug/deque: (deque::erase) Properly handle invalidation
+       when erasing at the end of the deque.
+       * include/debug/vector: (vector::swap): Swap _M_guaranteed_capacity. 
+       (vector::clear): Set the guaranteed capacity to 0.
+       * testsuite/23_containers/deque/invalidation/4.cc: (test04): Test
+       iterator invalidation when erasing at the end of the deque.
+
 2003-11-13  Paolo Carlini  <pcarlini@suse.de>
            Petur Runolfsson  <peturr02@ru.is>
 
index be4a8614b0d485e498808d8c43950d0e4d48d290..91e13c14429f0867948959e26892049f6b4f9f41 100644 (file)
   functionally equivalent to the standard drop-in containers used in
   debug mode, but they are available in a separate namespace as GNU
   extensions and may be used in programs compiled with either release
-  mode or with debug mode. However, unlike the containers in namespace
-  <code>std</code>, these containers may not be specialized. The
+  mode or with debug mode. The
   following table provides the names and headers of the debugging
   containers:
 
 </table>
 
 <h4 class="left">Debug mode semantics</h4>
-<p>A program that does not use the C++ standard library incorrectly
+<p>A program that uses the C++ standard library correctly
   will maintain the same semantics under debug mode as it had with
   the normal (release) library. All functional and exception-handling
   guarantees made by the normal library also hold for the debug mode
   library, and is therefore somewhat hazardous. For this reason, the
   libstdc++ debug mode offers a "pedantic" mode (similar to
   GCC's <code>-pedantic</code> compiler flag) that attempts to emulate
-  the semantics guaranteed by the C++ standard. In pedantic mode, for
+  the semantics guaranteed by the C++ standard. For
   instance, constructing a <code>std::basic_string</code> with a NULL
   character pointer would result in an exception under normal mode or
   non-pedantic debug mode (this is a libstdc++ extension), whereas
 <p>The following library components provide extra debugging
   capabilities in debug mode:</p>
 <ul>
+  <li><code>std::basic_string</code> (no safe iterators)</li>
   <li><code>std::bitset</code></li>
   <li><code>std::deque</code></li>
   <li><code>__gnu_cxx::hash_map</code></li>
index cc42dd25ef130af61404d8ae903d5443bca2c2a7..b62ad8f5572672ba7195637be1107dce839ac6b7 100644 (file)
@@ -330,7 +330,7 @@ template&lt;typename _Tp, typename _Allocator = allocator&lt;_Tp&gt;
 <p>In release mode, we define only the release-mode version of the
   component with its standard name and do not include the debugging
   component at all. The release mode version is defined within the
-  namespace <code>__gnu_nom</code>, and then associated with namespace
+  namespace <code>__gnu_norm</code>, and then associated with namespace
   <code>std</code> via a "strong using" directive. Minus the
   namespace associations, this method leaves the behavior of release
   mode completely unchanged from its behavior prior to the
index 34a373ce1a500ae15b6cdc23712396b1be688667..204757b3dc6b464aafc2cf4b679c7f92197a338e 100644 (file)
@@ -52,7 +52,7 @@ namespace std
 
   template<typename _Type>
     inline bool
-    __is_null_pointer(const _Type&)
+    __is_null_pointer(_Type)
     { return false; }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
index b9d68af598a611b09e1c1243897b3ca3b1890c48..818d59e2b687595260ac56ed5a261265110615db 100644 (file)
@@ -294,7 +294,7 @@ namespace __gnu_debug_def
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 151. can't currently clear() empty container
        __glibcxx_check_erase_range(__first, __last);
-       if (__first == begin() || __last == end()-1)
+        if (__first == begin() || __last == end())
          {
            this->_M_detach_singular();
            for (iterator __position = __first; __position != __last; )
index 19249b6bb818b6edc824dd260ff4be274d9e4b72..53e6f0cc15f11754daa3a2b5184209b5b5a00025 100644 (file)
@@ -34,6 +34,7 @@
 #include <vector>
 #include <debug/safe_sequence.h>
 #include <debug/safe_iterator.h>
+#include <utility>
 
 namespace __gnu_debug_def
 {
@@ -328,6 +329,7 @@ namespace __gnu_debug_def
       {
        _Base::swap(__x);
        this->_M_swap(__x);
+        std::swap(_M_guaranteed_capacity, __x._M_guaranteed_capacity);
       }
 
       void 
@@ -335,6 +337,7 @@ namespace __gnu_debug_def
       {
        _Base::clear();
        this->_M_invalidate_all();
+        _M_guaranteed_capacity = 0;
       }
 
       _Base&       
index 1918737cf93ec6255d46b1f33a6d3d6a982ae4ee..c8a8b88a9edda358497d3fd832becc1da74277f3 100644 (file)
@@ -55,6 +55,12 @@ void test04()
   VERIFY(before._M_singular());
   VERIFY(at._M_singular());
 
+  // Multiple element erase at end
+  before = v.begin();
+  at = before + 3;
+  v.erase(at, v.end());
+  *before;
+
   // clear()
   before = v.begin();
   VERIFY(before._M_dereferenceable());