Skip to content

Commit d2ccf33

Browse files
authored
[libc++][sstream] Explicitly delete special member functions (#80254)
The standard declares the copy constructors and copy assign operators as deleted. References: - https://eel.is/c++draft/string.streams
1 parent 66f7310 commit d2ccf33

File tree

9 files changed

+308
-156
lines changed

9 files changed

+308
-156
lines changed

libcxx/include/sstream

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@ public:
4848
template <class SAlloc>
4949
explicit basic_stringbuf(const basic_string<char_type, traits_type, SAlloc>& s,
5050
ios_base::openmode which = ios_base::in | ios_base::out); // C++20
51+
basic_stringbuf(const basic_stringbuf&) = delete;
5152
basic_stringbuf(basic_stringbuf&& rhs);
5253
basic_stringbuf(basic_stringbuf&& rhs, const allocator_type& a); // C++20
5354
5455
// [stringbuf.assign] Assign and swap:
56+
basic_stringbuf& operator=(const basic_stringbuf&) = delete;
5557
basic_stringbuf& operator=(basic_stringbuf&& rhs);
5658
void swap(basic_stringbuf& rhs) noexcept(see below); // conditionally noexcept since C++20
5759
@@ -119,9 +121,11 @@ public:
119121
template <class SAlloc>
120122
explicit basic_istringstream(const basic_string<char_type, traits_type, SAlloc>& s,
121123
ios_base::openmode which = ios_base::in); // C++20
124+
basic_istringstream(const basic_istringstream&) = delete;
122125
basic_istringstream(basic_istringstream&& rhs);
123126
124127
// [istringstream.assign] Assign and swap:
128+
basic_istringstream& operator=(const basic_istringstream&) = delete;
125129
basic_istringstream& operator=(basic_istringstream&& rhs);
126130
void swap(basic_istringstream& rhs);
127131
@@ -178,9 +182,11 @@ public:
178182
template <class SAlloc>
179183
explicit basic_ostringstream(const basic_string<char_type, traits_type, SAlloc>& s,
180184
ios_base::openmode which = ios_base::out); // C++20
185+
basic_ostringstream(const basic_ostringstream&) = delete;
181186
basic_ostringstream(basic_ostringstream&& rhs);
182187
183188
// [ostringstream.assign] Assign and swap:
189+
basic_ostringstream& operator=(const basic_ostringstream&) = delete;
184190
basic_ostringstream& operator=(basic_ostringstream&& rhs);
185191
void swap(basic_ostringstream& rhs);
186192
@@ -237,9 +243,11 @@ public:
237243
template <class SAlloc>
238244
explicit basic_stringstream(const basic_string<char_type, traits_type, SAlloc>& s,
239245
ios_base::openmode which = ios_base::out | ios_base::in); // C++20
246+
basic_stringstream(const basic_stringstream&) = delete;
240247
basic_stringstream(basic_stringstream&& rhs);
241248
242249
// [stringstream.assign] Assign and swap:
250+
basic_stringstream& operator=(const basic_stringstream&) = delete;
243251
basic_stringstream& operator=(basic_stringstream&& rhs);
244252
void swap(basic_stringstream& rhs);
245253
@@ -364,6 +372,7 @@ public:
364372
}
365373
#endif // _LIBCPP_STD_VER >= 20
366374

375+
basic_stringbuf(const basic_stringbuf&) = delete;
367376
basic_stringbuf(basic_stringbuf&& __rhs) : __mode_(__rhs.__mode_) { __move_init(std::move(__rhs)); }
368377

369378
#if _LIBCPP_STD_VER >= 20
@@ -374,6 +383,7 @@ public:
374383
#endif
375384

376385
// [stringbuf.assign] Assign and swap:
386+
basic_stringbuf& operator=(const basic_stringbuf&) = delete;
377387
basic_stringbuf& operator=(basic_stringbuf&& __rhs);
378388
void swap(basic_stringbuf& __rhs)
379389
#if _LIBCPP_STD_VER >= 20
@@ -822,12 +832,14 @@ public:
822832
: basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::in) {}
823833
#endif // _LIBCPP_STD_VER >= 20
824834

835+
basic_istringstream(const basic_istringstream&) = delete;
825836
_LIBCPP_HIDE_FROM_ABI basic_istringstream(basic_istringstream&& __rhs)
826837
: basic_istream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
827838
basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_);
828839
}
829840

830841
// [istringstream.assign] Assign and swap:
842+
basic_istringstream& operator=(const basic_istringstream&) = delete;
831843
basic_istringstream& operator=(basic_istringstream&& __rhs) {
832844
basic_istream<char_type, traits_type>::operator=(std::move(__rhs));
833845
__sb_ = std::move(__rhs.__sb_);
@@ -929,12 +941,14 @@ public:
929941
: basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::out) {}
930942
#endif // _LIBCPP_STD_VER >= 20
931943

944+
basic_ostringstream(const basic_ostringstream&) = delete;
932945
_LIBCPP_HIDE_FROM_ABI basic_ostringstream(basic_ostringstream&& __rhs)
933946
: basic_ostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
934947
basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_);
935948
}
936949

937950
// [ostringstream.assign] Assign and swap:
951+
basic_ostringstream& operator=(const basic_ostringstream&) = delete;
938952
basic_ostringstream& operator=(basic_ostringstream&& __rhs) {
939953
basic_ostream<char_type, traits_type>::operator=(std::move(__rhs));
940954
__sb_ = std::move(__rhs.__sb_);
@@ -1040,12 +1054,14 @@ public:
10401054
: basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch) {}
10411055
#endif // _LIBCPP_STD_VER >= 20
10421056

1057+
basic_stringstream(const basic_stringstream&) = delete;
10431058
_LIBCPP_HIDE_FROM_ABI basic_stringstream(basic_stringstream&& __rhs)
10441059
: basic_iostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
10451060
basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_);
10461061
}
10471062

10481063
// [stringstream.assign] Assign and swap:
1064+
basic_stringstream& operator=(const basic_stringstream&) = delete;
10491065
basic_stringstream& operator=(basic_stringstream&& __rhs) {
10501066
basic_iostream<char_type, traits_type>::operator=(std::move(__rhs));
10511067
__sb_ = std::move(__rhs.__sb_);
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// <sstream>
10+
11+
// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
12+
// class basic_istringstream
13+
// : public basic_istream<charT, traits>
14+
// {
15+
// public:
16+
// typedef charT char_type;
17+
// typedef traits traits_type;
18+
// typedef typename traits_type::int_type int_type;
19+
// typedef typename traits_type::pos_type pos_type;
20+
// typedef typename traits_type::off_type off_type;
21+
// typedef Allocator allocator_type;
22+
//
23+
// basic_istringstream(const basic_istringstream&) = delete;
24+
// basic_istringstream& operator=(const basic_istringstream&) = delete;
25+
//
26+
// basic_istringstream(basic_istringstream&& rhs);
27+
// basic_istringstream& operator=(basic_istringstream&& rhs);
28+
29+
#include <sstream>
30+
#include <type_traits>
31+
32+
#include "test_macros.h"
33+
34+
// Types
35+
36+
static_assert(std::is_base_of<std::basic_istream<char>, std::basic_istringstream<char> >::value, "");
37+
static_assert(std::is_same<std::basic_istringstream<char>::char_type, char>::value, "");
38+
static_assert(std::is_same<std::basic_istringstream<char>::traits_type, std::char_traits<char> >::value, "");
39+
static_assert(std::is_same<std::basic_istringstream<char>::int_type, std::char_traits<char>::int_type>::value, "");
40+
static_assert(std::is_same<std::basic_istringstream<char>::pos_type, std::char_traits<char>::pos_type>::value, "");
41+
static_assert(std::is_same<std::basic_istringstream<char>::off_type, std::char_traits<char>::off_type>::value, "");
42+
static_assert(std::is_same<std::basic_istringstream<char>::allocator_type, std::allocator<char> >::value, "");
43+
44+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
45+
static_assert(std::is_base_of<std::basic_istream<wchar_t>, std::basic_istringstream<wchar_t> >::value, "");
46+
static_assert(std::is_same<std::basic_istringstream<wchar_t>::char_type, wchar_t>::value, "");
47+
static_assert(std::is_same<std::basic_istringstream<wchar_t>::traits_type, std::char_traits<wchar_t> >::value, "");
48+
static_assert(std::is_same<std::basic_istringstream<wchar_t>::int_type, std::char_traits<wchar_t>::int_type>::value,
49+
"");
50+
static_assert(std::is_same<std::basic_istringstream<wchar_t>::pos_type, std::char_traits<wchar_t>::pos_type>::value,
51+
"");
52+
static_assert(std::is_same<std::basic_istringstream<wchar_t>::off_type, std::char_traits<wchar_t>::off_type>::value,
53+
"");
54+
static_assert(std::is_same<std::basic_istringstream<wchar_t>::allocator_type, std::allocator<wchar_t> >::value, "");
55+
#endif
56+
57+
// Copy properties
58+
59+
static_assert(!std::is_copy_constructible<std::istringstream>::value, "");
60+
static_assert(!std::is_copy_assignable<std::istringstream>::value, "");
61+
62+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
63+
static_assert(!std::is_copy_constructible<std::wistringstream>::value, "");
64+
static_assert(!std::is_copy_assignable<std::wistringstream>::value, "");
65+
#endif
66+
67+
// Move properties
68+
69+
static_assert(std::is_move_constructible<std::istringstream>::value, "");
70+
static_assert(std::is_move_assignable<std::istringstream>::value, "");
71+
72+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
73+
static_assert(std::is_move_constructible<std::wistringstream>::value, "");
74+
static_assert(std::is_move_assignable<std::wistringstream>::value, "");
75+
#endif

libcxx/test/std/input.output/string.streams/istringstream/types.pass.cpp

Lines changed: 0 additions & 39 deletions
This file was deleted.
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// <sstream>
10+
11+
// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
12+
// class basic_ostringstream
13+
// : public basic_ostream<charT, traits>
14+
// {
15+
// public:
16+
// typedef charT char_type;
17+
// typedef traits traits_type;
18+
// typedef typename traits_type::int_type int_type;
19+
// typedef typename traits_type::pos_type pos_type;
20+
// typedef typename traits_type::off_type off_type;
21+
// typedef Allocator allocator_type;
22+
//
23+
// basic_ostringstream(const basic_ostringstream&) = delete;
24+
// basic_ostringstream& operator=(const basic_ostringstream&) = delete;
25+
//
26+
// basic_ostringstream(basic_ostringstream&& rhs);
27+
// basic_ostringstream& operator=(basic_ostringstream&& rhs);
28+
29+
#include <sstream>
30+
#include <type_traits>
31+
32+
#include "test_macros.h"
33+
34+
// Types
35+
36+
static_assert(std::is_base_of<std::basic_ostream<char>, std::basic_ostringstream<char> >::value, "");
37+
static_assert(std::is_same<std::basic_ostringstream<char>::char_type, char>::value, "");
38+
static_assert(std::is_same<std::basic_ostringstream<char>::traits_type, std::char_traits<char> >::value, "");
39+
static_assert(std::is_same<std::basic_ostringstream<char>::int_type, std::char_traits<char>::int_type>::value, "");
40+
static_assert(std::is_same<std::basic_ostringstream<char>::pos_type, std::char_traits<char>::pos_type>::value, "");
41+
static_assert(std::is_same<std::basic_ostringstream<char>::off_type, std::char_traits<char>::off_type>::value, "");
42+
static_assert(std::is_same<std::basic_ostringstream<char>::allocator_type, std::allocator<char> >::value, "");
43+
44+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
45+
static_assert(std::is_base_of<std::basic_ostream<wchar_t>, std::basic_ostringstream<wchar_t> >::value, "");
46+
static_assert(std::is_same<std::basic_ostringstream<wchar_t>::char_type, wchar_t>::value, "");
47+
static_assert(std::is_same<std::basic_ostringstream<wchar_t>::traits_type, std::char_traits<wchar_t> >::value, "");
48+
static_assert(std::is_same<std::basic_ostringstream<wchar_t>::int_type, std::char_traits<wchar_t>::int_type>::value,
49+
"");
50+
static_assert(std::is_same<std::basic_ostringstream<wchar_t>::pos_type, std::char_traits<wchar_t>::pos_type>::value,
51+
"");
52+
static_assert(std::is_same<std::basic_ostringstream<wchar_t>::off_type, std::char_traits<wchar_t>::off_type>::value,
53+
"");
54+
static_assert(std::is_same<std::basic_ostringstream<wchar_t>::allocator_type, std::allocator<wchar_t> >::value, "");
55+
#endif
56+
57+
// Copy properties
58+
59+
static_assert(!std::is_copy_constructible<std::ostringstream>::value, "");
60+
static_assert(!std::is_copy_assignable<std::ostringstream>::value, "");
61+
62+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
63+
static_assert(!std::is_copy_constructible<std::wostringstream>::value, "");
64+
static_assert(!std::is_copy_assignable<std::wostringstream>::value, "");
65+
#endif
66+
67+
// Move properties
68+
69+
static_assert(std::is_move_constructible<std::ostringstream>::value, "");
70+
static_assert(std::is_move_assignable<std::ostringstream>::value, "");
71+
72+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
73+
static_assert(std::is_move_constructible<std::wostringstream>::value, "");
74+
static_assert(std::is_move_assignable<std::wostringstream>::value, "");
75+
#endif

libcxx/test/std/input.output/string.streams/ostringstream/types.pass.cpp

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)