This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[PATCH] Fix libstdc++/8347
- From: Paolo Carlini <pcarlini at unitus dot it>
- To: libstdc++ at gcc dot gnu dot org
- Date: Fri, 25 Oct 2002 18:35:22 +0200
- Subject: [PATCH] Fix libstdc++/8347
Hi again,
here is my proposal, as anticipated.
The idea is the following: in _S_construct we throw for a NULL
__beg only *after* having considered the possibility __beg == __end.
This is almost all, only we have to tweak the constructor
string(const _CharT*, const _Alloc&) not to pass to
_S_construct a pair of NULLs when its first argument is a NULL,
since we *want* to raise an exception in this specific case!
Tested x86-Linux.
Ok?
Ciao, Paolo.
2002-10-25 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;
}