Skip to content

Commit df2f15b

Browse files
author
redi
committed
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@253024 138bc75d-0d04-0410-961f-82ee72b054a4
1 parent e8b3292 commit df2f15b

File tree

4 files changed

+115
-0
lines changed

4 files changed

+115
-0
lines changed

libstdc++-v3/ChangeLog

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
2017-09-20 Jonathan Wakely <[email protected]>
22

3+
PR libstdc++/79162
4+
* include/bits/basic_string.h (basic_string::_If_sv): Remove from the
5+
overload set when the argument is derived from basic_string.
6+
* testsuite/21_strings/basic_string/cons/char/moveable2_c++17.cc: New
7+
test.
8+
* testsuite/21_strings/basic_string/cons/wchar_t/moveable2_c++17.cc:
9+
New test.
10+
311
* testsuite/24_iterators/range_access_cpp17.cc: Fix order of dg-do
412
and dg-options directives. Fix invalid test.
513

libstdc++-v3/include/bits/basic_string.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
115115
template<typename _Tp, typename _Res>
116116
using _If_sv = enable_if_t<
117117
__and_<is_convertible<const _Tp&, __sv_type>,
118+
__not_<is_convertible<const _Tp*, const basic_string*>>,
118119
__not_<is_convertible<const _Tp&, const _CharT*>>>::value,
119120
_Res>;
120121

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// { dg-options "-std=gnu++17" }
2+
// { dg-do run { target c++17 } }
3+
4+
// Copyright (C) 2011-2017 Free Software Foundation, Inc.
5+
//
6+
// This file is part of the GNU ISO C++ Library. This library is free
7+
// software; you can redistribute it and/or modify it under the
8+
// terms of the GNU General Public License as published by the
9+
// Free Software Foundation; either version 3, or (at your option)
10+
// any later version.
11+
12+
// This library is distributed in the hope that it will be useful,
13+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
// GNU General Public License for more details.
16+
17+
// You should have received a copy of the GNU General Public License along
18+
// with this library; see the file COPYING3. If not see
19+
// <http://www.gnu.org/licenses/>.
20+
21+
// NOTE: This makes use of the fact that we know how moveable
22+
// is implemented on string (via swap). If the implementation changed
23+
// this test may begin to fail.
24+
25+
#include <string>
26+
#include <utility>
27+
#include <testsuite_hooks.h>
28+
29+
class tstring : public std::basic_string<char>
30+
{
31+
public:
32+
tstring() : std::basic_string<char>() {}
33+
tstring(tstring&& s) : std::basic_string<char>(std::move(s)) {}
34+
tstring& operator=(tstring&& s) = default;
35+
};
36+
37+
void test01()
38+
{
39+
tstring a, b;
40+
a.push_back('1');
41+
b = std::move(a);
42+
VERIFY( b.size() == 1 && b[0] == '1' && a.size() == 0 );
43+
44+
tstring c(std::move(b));
45+
VERIFY( c.size() == 1 && c[0] == '1' );
46+
VERIFY( b.size() == 0 );
47+
}
48+
49+
int main()
50+
{
51+
test01();
52+
return 0;
53+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// { dg-options "-std=gnu++17" }
2+
// { dg-do run { target c++17 } }
3+
4+
// Copyright (C) 2011-2017 Free Software Foundation, Inc.
5+
//
6+
// This file is part of the GNU ISO C++ Library. This library is free
7+
// software; you can redistribute it and/or modify it under the
8+
// terms of the GNU General Public License as published by the
9+
// Free Software Foundation; either version 3, or (at your option)
10+
// any later version.
11+
12+
// This library is distributed in the hope that it will be useful,
13+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
// GNU General Public License for more details.
16+
17+
// You should have received a copy of the GNU General Public License along
18+
// with this library; see the file COPYING3. If not see
19+
// <http://www.gnu.org/licenses/>.
20+
21+
// NOTE: This makes use of the fact that we know how moveable
22+
// is implemented on string (via swap). If the implementation changed
23+
// this test may begin to fail.
24+
25+
#include <string>
26+
#include <utility>
27+
#include <testsuite_hooks.h>
28+
29+
class tstring : public std::basic_string<wchar_t>
30+
{
31+
public:
32+
tstring() : std::basic_string<wchar_t>() {}
33+
tstring(tstring&& s) : std::basic_string<wchar_t>(std::move(s)) {}
34+
tstring& operator=(tstring&& s) = default;
35+
};
36+
37+
void test01()
38+
{
39+
tstring a, b;
40+
a.push_back(L'1');
41+
b = std::move(a);
42+
VERIFY( b.size() == 1 && b[0] == L'1' && a.size() == 0 );
43+
44+
tstring c(std::move(b));
45+
VERIFY( c.size() == 1 && c[0] == L'1' );
46+
VERIFY( b.size() == 0 );
47+
}
48+
49+
int main()
50+
{
51+
test01();
52+
return 0;
53+
}

0 commit comments

Comments
 (0)