From: Paolo Carlini Date: Tue, 5 Nov 2002 23:35:40 +0000 (+0100) Subject: re PR libstdc++/8466 (basic_stringbuf::str(basic_string const&) modifies its argument) X-Git-Tag: releases/gcc-3.2.1~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45fcde6230e56def29ae3f96552a9c753e47775a;p=thirdparty%2Fgcc.git re PR libstdc++/8466 (basic_stringbuf::str(basic_string const&) modifies its argument) 2002-11-05 Paolo Carlini PR libstdc++/8466 * include/std/std_sstream.h (basic_stringbuf::str(const __string_type&)): Cannot use simple assignment since the COW-nature of v3 basic_string is not taken into account in basic_stringbuf. * testsuite/27_io/stringstream_members.cc: Add test04 from PR. From-SVN: r58839 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 28ab80161bb3..0762403736c1 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2002-11-05 Paolo Carlini + + PR libstdc++/8466 + * include/std/std_sstream.h + (basic_stringbuf::str(const __string_type&)): + Cannot use simple assignment since the COW-nature of v3 + basic_string is not taken into account in basic_stringbuf. + * testsuite/27_io/stringstream_members.cc: Add test04 from PR. + 2002-11-04 Benjamin Kosnik * config/linker-map.gnu: Export string operator+. diff --git a/libstdc++-v3/include/std/std_sstream.h b/libstdc++-v3/include/std/std_sstream.h index 07e47b5d3d6d..5eb43d09e599 100644 --- a/libstdc++-v3/include/std/std_sstream.h +++ b/libstdc++-v3/include/std/std_sstream.h @@ -105,7 +105,8 @@ namespace std void str(const __string_type& __s) { - _M_string = __s; + // Cannot use _M_string = __s, since v3 strings are COW. + _M_string.assign(__s.c_str(), __s.size()); _M_stringbuf_init(_M_mode); } diff --git a/libstdc++-v3/testsuite/27_io/stringstream_members.cc b/libstdc++-v3/testsuite/27_io/stringstream_members.cc index 91ee79bcf40b..51635f72fd56 100644 --- a/libstdc++-v3/testsuite/27_io/stringstream_members.cc +++ b/libstdc++-v3/testsuite/27_io/stringstream_members.cc @@ -177,10 +177,26 @@ test03() std::stringstream ss2(str3, std::ios_base::in|std::ios_base::out); } +// libstdc++/8466 +void test04() +{ + bool test = true; + + const char* strlit00 = "orvieto"; + const std::string str00 = strlit00; + + std::ostringstream oss; + + oss.str(str00); + oss << "cortona"; + VERIFY( str00 == strlit00 ); +} + int main() { test01(); test02(); test03(); + test04(); return 0; }