diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 99d37d1fa66..121ac771e64 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2015-01-02 Bernd Edlinger + + PR libstdc++/64422 + * src/c++98/misc-inst.cc (string::erase): Add missing overloads. + (string::insert): Likewise. + (string::replace): Likewise. + (wstring::erase): Likewise. + (wstring::insert): Likewise. + (wstring::replace): Likewise. + * testsuite/21_strings/basic_string/modifiers/64422.cc: New testcase. + 2015-01-02 Jonathan Wakely PR libstdc++/64468 diff --git a/libstdc++-v3/src/c++98/misc-inst.cc b/libstdc++-v3/src/c++98/misc-inst.cc index 989218f6e7e..060dac28352 100644 --- a/libstdc++-v3/src/c++98/misc-inst.cc +++ b/libstdc++-v3/src/c++98/misc-inst.cc @@ -68,20 +68,36 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // C++98 members that are not instantiated by src/c++11/string-inst.cc // because they changed in C++11 to take const_iterator parameters. template string::iterator string::erase(iterator); + template string::iterator string::erase(iterator, iterator); + template void string::insert(iterator, size_type, char); template void string::insert(iterator, iterator, iterator); template string::iterator string::insert(iterator, char); + template string& string::replace(iterator, iterator, const string&); + template string& + string::replace(iterator, iterator, const char*, size_type); + template string& string::replace(iterator, iterator, const char*); template string& string::replace(iterator, iterator, size_type, char); template string& string::replace(iterator, iterator, char*, char*); + template string& + string::replace(iterator, iterator, const char*, const char*); template string& string::replace(iterator, iterator, iterator, iterator); template string& string::replace(iterator, iterator, const_iterator, const_iterator); #ifdef _GLIBCXX_USE_WCHAR_T template wstring::iterator wstring::erase(iterator); + template wstring::iterator wstring::erase(iterator, iterator); + template void wstring::insert(iterator, size_type, wchar_t); template void wstring::insert(iterator, iterator, iterator); template wstring::iterator wstring::insert(iterator, wchar_t); + template wstring& wstring::replace(iterator, iterator, const wstring&); + template wstring& + wstring::replace(iterator, iterator, const wchar_t*, size_type); + template wstring& wstring::replace(iterator, iterator, const wchar_t*); template wstring& wstring::replace(iterator, iterator, size_type, wchar_t); template wstring& wstring::replace(iterator, iterator, wchar_t*, wchar_t*); + template wstring& + wstring::replace(iterator, iterator, const wchar_t*, const wchar_t*); template wstring& wstring::replace(iterator, iterator, iterator, iterator); template wstring& wstring::replace(iterator, iterator, const_iterator, const_iterator); diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/64422.cc b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/64422.cc new file mode 100644 index 00000000000..4b37ba97f17 --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/64422.cc @@ -0,0 +1,49 @@ +// 2015-01-02 Bernd Edlinger + +// Copyright (C) 2005-2015 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +/* { dg-do link } */ +/* { dg-options "-O0" } */ + +#include + +int +main () +{ + std::string x; + x.insert (x.begin (), 10, 'x'); + const char test[] = "test"; + x.replace (x.begin (), x.end (), test, 4); + x.replace (x.begin (), x.end (), test); + char best[] = "best"; + x.replace (x.begin (), x.end (), best, best + 4); + x.replace (x.begin (), x.end (), x); + x.erase (x.begin (), x.end ()); +#ifdef _GLIBCXX_USE_WCHAR_T + std::wstring w; + w.insert (w.begin (), 10, L'x'); + const wchar_t west[] = L"west"; + w.replace (w.begin (), w.end (), west, 4); + w.replace (w.begin (), w.end (), west); + wchar_t rest[] = L"rest"; + w.replace (w.begin (), w.end (), rest, rest + 4); + w.replace (w.begin (), w.end (), w); + w.erase (w.begin (), w.end ()); +#endif + return 0; +}