diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2017-09-20 18:59:50 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2017-09-20 18:59:50 +0100 |
commit | 4cf5930fdc57650226d53eb4809ee4e565799456 (patch) | |
tree | f021adf2d63264032fe3631076a5e3242400bc6f /libstdc++-v3 | |
parent | 836cccc71d0aef7308b8f4c02214ac2ed2f3643d (diff) | |
download | gcc-4cf5930fdc57650226d53eb4809ee4e565799456.zip gcc-4cf5930fdc57650226d53eb4809ee4e565799456.tar.gz gcc-4cf5930fdc57650226d53eb4809ee4e565799456.tar.bz2 |
PR libstdc++/79162 Fix std::string regression due to LWG 2946
PR libstdc++/79162
* include/bits/basic_string.h (basic_string::_If_sv): Remove from the
overload set when the argument is derived from basic_string.
* testsuite/21_strings/basic_string/cons/char/moveable2_c++17.cc: New
test.
* testsuite/21_strings/basic_string/cons/wchar_t/moveable2_c++17.cc:
New test.
From-SVN: r253024
Diffstat (limited to 'libstdc++-v3')
4 files changed, 115 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9019455..ceb883e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2017-09-20 Jonathan Wakely <jwakely@redhat.com> + PR libstdc++/79162 + * include/bits/basic_string.h (basic_string::_If_sv): Remove from the + overload set when the argument is derived from basic_string. + * testsuite/21_strings/basic_string/cons/char/moveable2_c++17.cc: New + test. + * testsuite/21_strings/basic_string/cons/wchar_t/moveable2_c++17.cc: + New test. + * testsuite/24_iterators/range_access_cpp17.cc: Fix order of dg-do and dg-options directives. Fix invalid test. diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 0ef139b..8a382d5 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -115,6 +115,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 template<typename _Tp, typename _Res> using _If_sv = enable_if_t< __and_<is_convertible<const _Tp&, __sv_type>, + __not_<is_convertible<const _Tp*, const basic_string*>>, __not_<is_convertible<const _Tp&, const _CharT*>>>::value, _Res>; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/moveable2_c++17.cc b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/moveable2_c++17.cc new file mode 100644 index 0000000..88be60d --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/moveable2_c++17.cc @@ -0,0 +1,53 @@ +// { dg-options "-std=gnu++17" } +// { dg-do run { target c++17 } } + +// Copyright (C) 2011-2017 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 +// <http://www.gnu.org/licenses/>. + +// NOTE: This makes use of the fact that we know how moveable +// is implemented on string (via swap). If the implementation changed +// this test may begin to fail. + +#include <string> +#include <utility> +#include <testsuite_hooks.h> + +class tstring : public std::basic_string<char> +{ +public: + tstring() : std::basic_string<char>() {} + tstring(tstring&& s) : std::basic_string<char>(std::move(s)) {} + tstring& operator=(tstring&& s) = default; +}; + +void test01() +{ + tstring a, b; + a.push_back('1'); + b = std::move(a); + VERIFY( b.size() == 1 && b[0] == '1' && a.size() == 0 ); + + tstring c(std::move(b)); + VERIFY( c.size() == 1 && c[0] == '1' ); + VERIFY( b.size() == 0 ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/moveable2_c++17.cc b/libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/moveable2_c++17.cc new file mode 100644 index 0000000..63684de --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/moveable2_c++17.cc @@ -0,0 +1,53 @@ +// { dg-options "-std=gnu++17" } +// { dg-do run { target c++17 } } + +// Copyright (C) 2011-2017 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 +// <http://www.gnu.org/licenses/>. + +// NOTE: This makes use of the fact that we know how moveable +// is implemented on string (via swap). If the implementation changed +// this test may begin to fail. + +#include <string> +#include <utility> +#include <testsuite_hooks.h> + +class tstring : public std::basic_string<wchar_t> +{ +public: + tstring() : std::basic_string<wchar_t>() {} + tstring(tstring&& s) : std::basic_string<wchar_t>(std::move(s)) {} + tstring& operator=(tstring&& s) = default; +}; + +void test01() +{ + tstring a, b; + a.push_back(L'1'); + b = std::move(a); + VERIFY( b.size() == 1 && b[0] == L'1' && a.size() == 0 ); + + tstring c(std::move(b)); + VERIFY( c.size() == 1 && c[0] == L'1' ); + VERIFY( b.size() == 0 ); +} + +int main() +{ + test01(); + return 0; +} |