re PR libstdc++/8347 (empty vector range used in string construction causes core...
authorPaolo Carlini <pcarlini@unitus.it>
Sun, 27 Oct 2002 07:35:06 +0000 (08:35 +0100)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sun, 27 Oct 2002 07:35:06 +0000 (07:35 +0000)
2002-10-27  Paolo Carlini  <pcarlini@unitus.it>

PR libstdc++/8347
* include/bits/basic_string.tcc
(string::_S_construct(_InIter, _InIter, const _Alloc&,
forward_iterator_tag)): Do not throw logic error if
__beg == NULL && __end == __beg.
(string::string(const _CharT*, const _Alloc&)): Tweak.
* testsuite/21_strings/ctor_copy_dtor.cc: Add test05 from PR.

From-SVN: r58577

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/basic_string.tcc
libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc

index bf9f8acfc54ebda8fbfb94cf3d1634872a4bfe43..a62709a93e8a99332cd79de1584f2d2d24856f6b 100644 (file)
@@ -1,3 +1,13 @@
+2002-10-27  Paolo Carlini  <pcarlini@unitus.it>
+
+       PR libstdc++/8347
+       * include/bits/basic_string.tcc
+       (string::_S_construct(_InIter, _InIter, const _Alloc&,
+       forward_iterator_tag)): Do not throw logic error if
+       __beg == NULL && __end == __beg.
+       (string::string(const _CharT*, const _Alloc&)): Tweak.
+       * testsuite/21_strings/ctor_copy_dtor.cc: Add test05 from PR.
+
 2002-10-24  Hans-Peter Nilsson  <hp@bitrange.com>
 
        PR other/3337
index 296d43ab1d92654fc2e010bbfa3e1ce346c9c8d8..3047dfa5ba7e965ef295e99534aa91dbf7c4c580 100644 (file)
@@ -139,13 +139,13 @@ namespace std
       {
        size_type __dnew = static_cast<size_type>(distance(__beg, __end));
 
+       if (__beg == __end && __a == _Alloc())
+         return _S_empty_rep()._M_refcopy();
+
        // NB: Not required, but considered best practice.
        if (__builtin_expect(__beg == _InIter(), 0))
          __throw_logic_error("attempt to create string with null pointer");
        
-       if (__beg == __end && __a == _Alloc())
-         return _S_empty_rep()._M_refcopy();
-
        // Check for out_of_range and length_error exceptions.
        _Rep* __r = _Rep::_S_create(__dnew, __a);
        try 
@@ -223,8 +223,8 @@ namespace std
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>::
     basic_string(const _CharT* __s, const _Alloc& __a)
-    : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) : 0, 
-                              __a), __a)
+    : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) :
+                              __s + npos, __a), __a)
     { }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
index ea22cfc2aa2f3e8432625d6c5e6e34cf3e08892d..63c8be429940792192c24b2f2ba000f7e350faca 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <new>
 #include <string>
+#include <vector>
 #include <stdexcept>
 #include <testsuite_hooks.h>
 
@@ -214,6 +215,15 @@ void test04()
   VERIFY( str02 == "onifotrop" );
 }
 
+// libstdc++/8347
+void test05()
+{
+  bool test = true;
+
+  std::vector<char> empty;
+  std::string empty2(empty.begin(), empty.end());
+}
+
 int main()
 { 
   __set_testsuite_memlimit();
@@ -221,5 +231,6 @@ int main()
   test02();
   test03();
   test04();
+  test05();
   return 0;
 }