Skip to content

Commit 4dee641

Browse files
authored
[libc++] Implements LWG3130. (llvm#101889)
This adds addressof at the required places in [input.output]. Some of the new tests failed since string used operator& internally. These have been fixed too. Note the new fstream tests perform output to a basic_string instead of a double. Using a double requires num_get specialization num_get<CharT, istreambuf_iterator<CharT, char_traits_operator_hijacker<CharT>> This facet is not present in the locale database so the conversion would fail due to a missing locale facet. Using basic_string avoids using the locale. As a drive-by fixes several bugs in the ofstream.cons tests. These tested ifstream instead of ofstream with an open mode. Implements: - LWG3130 [input.output] needs many addressof Closes llvm#100246.
1 parent 66f4e3f commit 4dee641

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+941
-177
lines changed

libcxx/docs/Status/Cxx20Issues.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
"`LWG3127 <https://wg21.link/LWG3127>`__","``basic_osyncstream::rdbuf``\ needs a ``const_cast``\ ","San Diego","|Complete|","18.0",""
118118
"`LWG3128 <https://wg21.link/LWG3128>`__","``strstream::rdbuf``\ needs a ``const_cast``\ ","San Diego","|Nothing To Do|","",""
119119
"`LWG3129 <https://wg21.link/LWG3129>`__","``regex_token_iterator``\ constructor uses wrong pointer arithmetic","San Diego","","",""
120-
"`LWG3130 <https://wg21.link/LWG3130>`__","|sect|\ [input.output] needs many ``addressof``\ ","San Diego","","",""
120+
"`LWG3130 <https://wg21.link/LWG3130>`__","|sect|\ [input.output] needs many ``addressof``\ ","San Diego","|Complete|","20.0",""
121121
"`LWG3131 <https://wg21.link/LWG3131>`__","``addressof``\ all the things","San Diego","","",""
122122
"`LWG3132 <https://wg21.link/LWG3132>`__","Library needs to ban macros named ``expects``\ or ``ensures``\ ","San Diego","|Nothing To Do|","",""
123123
"`LWG3134 <https://wg21.link/LWG3134>`__","[fund.ts.v3] LFTSv3 contains extraneous [meta] variable templates that should have been deleted by P09961","San Diego","Resolved by `P1210R0 <https://wg21.link/P1210R0>`__","",""

libcxx/include/fstream

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ typedef basic_fstream<wchar_t> wfstream;
191191
#include <__config>
192192
#include <__fwd/fstream.h>
193193
#include <__locale>
194+
#include <__memory/addressof.h>
194195
#include <__type_traits/enable_if.h>
195196
#include <__type_traits/is_same.h>
196197
#include <__utility/move.h>
@@ -1136,35 +1137,37 @@ private:
11361137
};
11371138

11381139
template <class _CharT, class _Traits>
1139-
inline basic_ifstream<_CharT, _Traits>::basic_ifstream() : basic_istream<char_type, traits_type>(&__sb_) {}
1140+
inline basic_ifstream<_CharT, _Traits>::basic_ifstream()
1141+
: basic_istream<char_type, traits_type>(std::addressof(__sb_)) {}
11401142

11411143
template <class _CharT, class _Traits>
11421144
inline basic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
1143-
: basic_istream<char_type, traits_type>(&__sb_) {
1145+
: basic_istream<char_type, traits_type>(std::addressof(__sb_)) {
11441146
if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
11451147
this->setstate(ios_base::failbit);
11461148
}
11471149

11481150
# ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
11491151
template <class _CharT, class _Traits>
11501152
inline basic_ifstream<_CharT, _Traits>::basic_ifstream(const wchar_t* __s, ios_base::openmode __mode)
1151-
: basic_istream<char_type, traits_type>(&__sb_) {
1153+
: basic_istream<char_type, traits_type>(std::addressof(__sb_)) {
11521154
if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
11531155
this->setstate(ios_base::failbit);
11541156
}
11551157
# endif
11561158

1159+
// extension
11571160
template <class _CharT, class _Traits>
11581161
inline basic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
1159-
: basic_istream<char_type, traits_type>(&__sb_) {
1162+
: basic_istream<char_type, traits_type>(std::addressof(__sb_)) {
11601163
if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
11611164
this->setstate(ios_base::failbit);
11621165
}
11631166

11641167
template <class _CharT, class _Traits>
11651168
inline basic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
11661169
: basic_istream<char_type, traits_type>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
1167-
this->set_rdbuf(&__sb_);
1170+
this->set_rdbuf(std::addressof(__sb_));
11681171
}
11691172

11701173
template <class _CharT, class _Traits>
@@ -1187,7 +1190,7 @@ inline _LIBCPP_HIDE_FROM_ABI void swap(basic_ifstream<_CharT, _Traits>& __x, bas
11871190

11881191
template <class _CharT, class _Traits>
11891192
inline basic_filebuf<_CharT, _Traits>* basic_ifstream<_CharT, _Traits>::rdbuf() const {
1190-
return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1193+
return const_cast<basic_filebuf<char_type, traits_type>*>(std::addressof(__sb_));
11911194
}
11921195

11931196
template <class _CharT, class _Traits>
@@ -1293,35 +1296,37 @@ private:
12931296
};
12941297

12951298
template <class _CharT, class _Traits>
1296-
inline basic_ofstream<_CharT, _Traits>::basic_ofstream() : basic_ostream<char_type, traits_type>(&__sb_) {}
1299+
inline basic_ofstream<_CharT, _Traits>::basic_ofstream()
1300+
: basic_ostream<char_type, traits_type>(std::addressof(__sb_)) {}
12971301

12981302
template <class _CharT, class _Traits>
12991303
inline basic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
1300-
: basic_ostream<char_type, traits_type>(&__sb_) {
1304+
: basic_ostream<char_type, traits_type>(std::addressof(__sb_)) {
13011305
if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
13021306
this->setstate(ios_base::failbit);
13031307
}
13041308

13051309
# ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
13061310
template <class _CharT, class _Traits>
13071311
inline basic_ofstream<_CharT, _Traits>::basic_ofstream(const wchar_t* __s, ios_base::openmode __mode)
1308-
: basic_ostream<char_type, traits_type>(&__sb_) {
1312+
: basic_ostream<char_type, traits_type>(std::addressof(__sb_)) {
13091313
if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
13101314
this->setstate(ios_base::failbit);
13111315
}
13121316
# endif
13131317

1318+
// extension
13141319
template <class _CharT, class _Traits>
13151320
inline basic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
1316-
: basic_ostream<char_type, traits_type>(&__sb_) {
1321+
: basic_ostream<char_type, traits_type>(std::addressof(__sb_)) {
13171322
if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
13181323
this->setstate(ios_base::failbit);
13191324
}
13201325

13211326
template <class _CharT, class _Traits>
13221327
inline basic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
13231328
: basic_ostream<char_type, traits_type>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
1324-
this->set_rdbuf(&__sb_);
1329+
this->set_rdbuf(std::addressof(__sb_));
13251330
}
13261331

13271332
template <class _CharT, class _Traits>
@@ -1344,7 +1349,7 @@ inline _LIBCPP_HIDE_FROM_ABI void swap(basic_ofstream<_CharT, _Traits>& __x, bas
13441349

13451350
template <class _CharT, class _Traits>
13461351
inline basic_filebuf<_CharT, _Traits>* basic_ofstream<_CharT, _Traits>::rdbuf() const {
1347-
return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1352+
return const_cast<basic_filebuf<char_type, traits_type>*>(std::addressof(__sb_));
13481353
}
13491354

13501355
template <class _CharT, class _Traits>
@@ -1454,35 +1459,37 @@ private:
14541459
};
14551460

14561461
template <class _CharT, class _Traits>
1457-
inline basic_fstream<_CharT, _Traits>::basic_fstream() : basic_iostream<char_type, traits_type>(&__sb_) {}
1462+
inline basic_fstream<_CharT, _Traits>::basic_fstream()
1463+
: basic_iostream<char_type, traits_type>(std::addressof(__sb_)) {}
14581464

14591465
template <class _CharT, class _Traits>
14601466
inline basic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
1461-
: basic_iostream<char_type, traits_type>(&__sb_) {
1467+
: basic_iostream<char_type, traits_type>(std::addressof(__sb_)) {
14621468
if (__sb_.open(__s, __mode) == nullptr)
14631469
this->setstate(ios_base::failbit);
14641470
}
14651471

14661472
# ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
14671473
template <class _CharT, class _Traits>
14681474
inline basic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_base::openmode __mode)
1469-
: basic_iostream<char_type, traits_type>(&__sb_) {
1475+
: basic_iostream<char_type, traits_type>(std::addressof(__sb_)) {
14701476
if (__sb_.open(__s, __mode) == nullptr)
14711477
this->setstate(ios_base::failbit);
14721478
}
14731479
# endif
14741480

14751481
template <class _CharT, class _Traits>
14761482
inline basic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
1477-
: basic_iostream<char_type, traits_type>(&__sb_) {
1483+
: basic_iostream<char_type, traits_type>(std::addressof(__sb_)) {
14781484
if (__sb_.open(__s, __mode) == nullptr)
14791485
this->setstate(ios_base::failbit);
14801486
}
14811487

1488+
// extension
14821489
template <class _CharT, class _Traits>
14831490
inline basic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
14841491
: basic_iostream<char_type, traits_type>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
1485-
this->set_rdbuf(&__sb_);
1492+
this->set_rdbuf(std::addressof(__sb_));
14861493
}
14871494

14881495
template <class _CharT, class _Traits>
@@ -1505,7 +1512,7 @@ inline _LIBCPP_HIDE_FROM_ABI void swap(basic_fstream<_CharT, _Traits>& __x, basi
15051512

15061513
template <class _CharT, class _Traits>
15071514
inline basic_filebuf<_CharT, _Traits>* basic_fstream<_CharT, _Traits>::rdbuf() const {
1508-
return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1515+
return const_cast<basic_filebuf<char_type, traits_type>*>(std::addressof(__sb_));
15091516
}
15101517

15111518
template <class _CharT, class _Traits>

libcxx/include/ios

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ storage-class-specifier const error_category& iostream_category() noexcept;
218218
# include <__fwd/ios.h>
219219
# include <__ios/fpos.h>
220220
# include <__locale>
221+
# include <__memory/addressof.h>
221222
# include <__system_error/error_category.h>
222223
# include <__system_error/error_code.h>
223224
# include <__system_error/error_condition.h>
@@ -621,11 +622,11 @@ protected:
621622
private:
622623
basic_ostream<char_type, traits_type>* __tie_;
623624

624-
#if defined(_LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE)
625+
# if defined(_LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE)
625626
using _FillType = _FillHelper<traits_type>;
626-
#else
627+
# else
627628
using _FillType = _SentinelValueFill<traits_type>;
628-
#endif
629+
# endif
629630
mutable _FillType __fill_;
630631
};
631632

@@ -640,7 +641,7 @@ basic_ios<_CharT, _Traits>::~basic_ios() {}
640641
template <class _CharT, class _Traits>
641642
inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::init(basic_streambuf<char_type, traits_type>* __sb) {
642643
ios_base::init(__sb);
643-
__tie_ = nullptr;
644+
__tie_ = nullptr;
644645
__fill_.__init();
645646
}
646647

@@ -707,7 +708,7 @@ inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::fill(char_type _
707708

708709
template <class _CharT, class _Traits>
709710
basic_ios<_CharT, _Traits>& basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs) {
710-
if (this != &__rhs) {
711+
if (this != std::addressof(__rhs)) {
711712
__call_callbacks(erase_event);
712713
ios_base::copyfmt(__rhs);
713714
__tie_ = __rhs.__tie_;

libcxx/include/sstream

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -872,13 +872,14 @@ private:
872872

873873
public:
874874
// [istringstream.cons] Constructors:
875-
_LIBCPP_HIDE_FROM_ABI basic_istringstream() : basic_istream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in) {}
875+
_LIBCPP_HIDE_FROM_ABI basic_istringstream()
876+
: basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::in) {}
876877

877878
_LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(ios_base::openmode __wch)
878-
: basic_istream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::in) {}
879+
: basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::in) {}
879880

880881
_LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(const string_type& __s, ios_base::openmode __wch = ios_base::in)
881-
: basic_istream<_CharT, _Traits>(&__sb_), __sb_(__s, __wch | ios_base::in) {}
882+
: basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::in) {}
882883

883884
#if _LIBCPP_STD_VER >= 20
884885
_LIBCPP_HIDE_FROM_ABI basic_istringstream(ios_base::openmode __wch, const _Allocator& __a)
@@ -924,7 +925,7 @@ public:
924925
basic_istringstream(const basic_istringstream&) = delete;
925926
_LIBCPP_HIDE_FROM_ABI basic_istringstream(basic_istringstream&& __rhs)
926927
: basic_istream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
927-
basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_);
928+
basic_istream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));
928929
}
929930

930931
// [istringstream.assign] Assign and swap:
@@ -941,7 +942,7 @@ public:
941942

942943
// [istringstream.members] Member functions:
943944
_LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {
944-
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
945+
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));
945946
}
946947

947948
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)
@@ -1007,13 +1008,14 @@ private:
10071008

10081009
public:
10091010
// [ostringstream.cons] Constructors:
1010-
_LIBCPP_HIDE_FROM_ABI basic_ostringstream() : basic_ostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::out) {}
1011+
_LIBCPP_HIDE_FROM_ABI basic_ostringstream()
1012+
: basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::out) {}
10111013

10121014
_LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(ios_base::openmode __wch)
1013-
: basic_ostream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::out) {}
1015+
: basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch | ios_base::out) {}
10141016

10151017
_LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(const string_type& __s, ios_base::openmode __wch = ios_base::out)
1016-
: basic_ostream<_CharT, _Traits>(&__sb_), __sb_(__s, __wch | ios_base::out) {}
1018+
: basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::out) {}
10171019

10181020
#if _LIBCPP_STD_VER >= 20
10191021
_LIBCPP_HIDE_FROM_ABI basic_ostringstream(ios_base::openmode __wch, const _Allocator& __a)
@@ -1060,7 +1062,7 @@ public:
10601062
basic_ostringstream(const basic_ostringstream&) = delete;
10611063
_LIBCPP_HIDE_FROM_ABI basic_ostringstream(basic_ostringstream&& __rhs)
10621064
: basic_ostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
1063-
basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_);
1065+
basic_ostream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));
10641066
}
10651067

10661068
// [ostringstream.assign] Assign and swap:
@@ -1078,7 +1080,7 @@ public:
10781080

10791081
// [ostringstream.members] Member functions:
10801082
_LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {
1081-
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
1083+
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));
10821084
}
10831085

10841086
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)
@@ -1145,14 +1147,14 @@ private:
11451147
public:
11461148
// [stringstream.cons] constructors
11471149
_LIBCPP_HIDE_FROM_ABI basic_stringstream()
1148-
: basic_iostream<_CharT, _Traits>(&__sb_), __sb_(ios_base::in | ios_base::out) {}
1150+
: basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(ios_base::in | ios_base::out) {}
11491151

11501152
_LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(ios_base::openmode __wch)
1151-
: basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__wch) {}
1153+
: basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__wch) {}
11521154

11531155
_LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(const string_type& __s,
11541156
ios_base::openmode __wch = ios_base::in | ios_base::out)
1155-
: basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__s, __wch) {}
1157+
: basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch) {}
11561158

11571159
#if _LIBCPP_STD_VER >= 20
11581160
_LIBCPP_HIDE_FROM_ABI basic_stringstream(ios_base::openmode __wch, const _Allocator& __a)
@@ -1201,7 +1203,7 @@ public:
12011203
basic_stringstream(const basic_stringstream&) = delete;
12021204
_LIBCPP_HIDE_FROM_ABI basic_stringstream(basic_stringstream&& __rhs)
12031205
: basic_iostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
1204-
basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_);
1206+
basic_istream<_CharT, _Traits>::set_rdbuf(std::addressof(__sb_));
12051207
}
12061208

12071209
// [stringstream.assign] Assign and swap:
@@ -1218,7 +1220,7 @@ public:
12181220

12191221
// [stringstream.members] Member functions:
12201222
_LIBCPP_HIDE_FROM_ABI basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {
1221-
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
1223+
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(std::addressof(__sb_));
12221224
}
12231225

12241226
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY)

libcxx/include/string

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ public:
10481048
__r_.first() = __str.__r_.first();
10491049
__str.__r_.first() = __rep();
10501050
__str.__annotate_new(0);
1051-
if (!__is_long() && this != &__str)
1051+
if (!__is_long() && this != std::addressof(__str))
10521052
__annotate_new(size());
10531053
}
10541054
}
@@ -2711,7 +2711,7 @@ basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, tr
27112711
__str.__set_short_size(0);
27122712
traits_type::assign(__str.__get_short_pointer()[0], value_type());
27132713

2714-
if (__str_was_short && this != &__str)
2714+
if (__str_was_short && this != std::addressof(__str))
27152715
__str.__annotate_shrink(__str_old_size);
27162716
else
27172717
// ASan annotations: was long, so object memory is unpoisoned as new.
@@ -2725,7 +2725,7 @@ basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, tr
27252725
// invariants hold (so functions without preconditions, such as the assignment operator,
27262726
// can be safely used on the object after it was moved from):"
27272727
// Quote: "v = std::move(v); // the value of v is unspecified"
2728-
if (!__is_long() && &__str != this)
2728+
if (!__is_long() && std::addressof(__str) != this)
27292729
// If it is long string, delete was never called on original __str's buffer.
27302730
__annotate_new(__get_short_size());
27312731
}
@@ -3450,13 +3450,13 @@ inline _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocat
34503450
"swapping non-equal allocators");
34513451
if (!__is_long())
34523452
__annotate_delete();
3453-
if (this != &__str && !__str.__is_long())
3453+
if (this != std::addressof(__str) && !__str.__is_long())
34543454
__str.__annotate_delete();
34553455
std::swap(__r_.first(), __str.__r_.first());
34563456
std::__swap_allocator(__alloc(), __str.__alloc());
34573457
if (!__is_long())
34583458
__annotate_new(__get_short_size());
3459-
if (this != &__str && !__str.__is_long())
3459+
if (this != std::addressof(__str) && !__str.__is_long())
34603460
__str.__annotate_new(__str.__get_short_size());
34613461
}
34623462

libcxx/test/std/input.output/file.streams/fstreams/fstream.cons/default.pass.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,25 @@
1414
// basic_fstream();
1515

1616
#include <fstream>
17-
#include <type_traits>
1817

1918
#include "test_macros.h"
19+
#include "operator_hijacker.h"
2020

2121
int main(int, char**)
2222
{
2323
{
2424
std::fstream fs;
2525
}
26+
{
27+
std::basic_fstream<char, operator_hijacker_char_traits<char> > fs;
28+
}
2629
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
2730
{
2831
std::wfstream fs;
2932
}
33+
{
34+
std::basic_fstream<wchar_t, operator_hijacker_char_traits<wchar_t> > fs;
35+
}
3036
#endif
3137

3238
return 0;

0 commit comments

Comments
 (0)