This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[v3] (Partial) fix for libstdc++/15002
- From: Paolo Carlini <pcarlini at suse dot de>
- To: "'gcc-patches at gcc dot gnu dot org'" <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 19 Apr 2004 13:37:04 +0200
- Subject: [v3] (Partial) fix for libstdc++/15002
Hi,
tested x86-linux, committed to mainline. The patch seems safe and
susrprisingly effective for its simplicity: if everything goes well
during the next weeks, will be also in 3.4.1.
Paolo.
////////////////
2004-04-19 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/15002 (partial)
* include/bits/basic_string.h (_M_replace_aux, _M_replace_safe):
Special case __n2 == 1, not calling traits_type::assign/copy.
diff -urN libstdc++-v3-orig/include/bits/basic_string.h libstdc++-v3/include/bits/basic_string.h
--- libstdc++-v3-orig/include/bits/basic_string.h 2004-02-27 01:49:49.000000000 +0100
+++ libstdc++-v3/include/bits/basic_string.h 2004-04-18 16:19:44.000000000 +0200
@@ -1342,7 +1342,9 @@
if (this->max_size() - (this->size() - __n1) < __n2)
__throw_length_error(__N("basic_string::_M_replace_aux"));
_M_mutate(__pos1, __n1, __n2);
- if (__n2)
+ if (__n2 == 1)
+ _M_data()[__pos1] = __c;
+ else if (__n2)
traits_type::assign(_M_data() + __pos1, __n2, __c);
return *this;
}
@@ -1352,7 +1354,9 @@
size_type __n2)
{
_M_mutate(__pos1, __n1, __n2);
- if (__n2)
+ if (__n2 == 1)
+ _M_data()[__pos1] = *__s;
+ else if (__n2)
traits_type::copy(_M_data() + __pos1, __s, __n2);
return *this;
}
@@ -1960,7 +1964,7 @@
* @param rhs Last string.
* @return New string with value of @a lhs followed by @a rhs.
*/
- template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)