aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2002-10-27 08:35:06 +0100
committerPaolo Carlini <paolo@gcc.gnu.org>2002-10-27 07:35:06 +0000
commit085825b83b283c7533aa4d95ceda37231c4c99dd (patch)
tree2c476023bdd470f4ec06836f5845a7aa69a038c6
parent881fc3545960a3a2da8d7c52fb87fd75039c22e5 (diff)
downloadgcc-085825b83b283c7533aa4d95ceda37231c4c99dd.zip
gcc-085825b83b283c7533aa4d95ceda37231c4c99dd.tar.gz
gcc-085825b83b283c7533aa4d95ceda37231c4c99dd.tar.bz2
re PR libstdc++/8347 (empty vector range used in string construction causes core dump.)
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
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/include/bits/basic_string.tcc10
-rw-r--r--libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc11
3 files changed, 26 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index bf9f8ac..a62709a 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc
index 296d43a..3047dfa 100644
--- a/libstdc++-v3/include/bits/basic_string.tcc
+++ b/libstdc++-v3/include/bits/basic_string.tcc
@@ -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>
diff --git a/libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc b/libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc
index ea22cfc..63c8be4 100644
--- a/libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc
+++ b/libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc
@@ -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;
}