diff options
author | Paolo Carlini <pcarlini@unitus.it> | 2002-10-27 08:35:06 +0100 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2002-10-27 07:35:06 +0000 |
commit | 085825b83b283c7533aa4d95ceda37231c4c99dd (patch) | |
tree | 2c476023bdd470f4ec06836f5845a7aa69a038c6 | |
parent | 881fc3545960a3a2da8d7c52fb87fd75039c22e5 (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.tcc | 10 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/21_strings/ctor_copy_dtor.cc | 11 |
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; } |