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
This commit is contained in:
parent
836cccc71d
commit
4cf5930fdc
4 changed files with 115 additions and 0 deletions
|
@ -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.
|
||||
|
||||
|
|
|
@ -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>;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue