This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] libstdc++/8347


Hi,

the below, tested x86-linux and approved by Benjamin, closes
the PR and makes v3 behave similarly to many other
implementations I have access to.

Ciao, Paolo.

////////////

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.



diff -urN libstdc++-v3-orig/include/bits/basic_string.tcc libstdc++-v3/include/bits/basic_string.tcc
--- libstdc++-v3-orig/include/bits/basic_string.tcc	2002-06-04 20:20:36.000000000 +0200
+++ libstdc++-v3/include/bits/basic_string.tcc	2002-10-25 18:03:09.000000000 +0200
@@ -139,13 +139,13 @@
       {
 	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 @@
   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>
diff -urN libstdc++-v3-orig/testsuite/21_strings/ctor_copy_dtor.cc libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc
--- libstdc++-v3-orig/testsuite/21_strings/ctor_copy_dtor.cc	2002-06-04 20:20:38.000000000 +0200
+++ libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc	2002-10-25 17:22:47.000000000 +0200
@@ -22,6 +22,7 @@
 
 #include <new>
 #include <string>
+#include <vector>
 #include <stdexcept>
 #include <testsuite_hooks.h>
 
@@ -214,6 +215,15 @@
   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 @@
   test02();
   test03();
   test04();
+  test05();
   return 0;
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]