From 7bd12fb10c31a2ce354a6cfcee63938ad0597013 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Wed, 10 Apr 2024 13:32:16 -0400 Subject: [PATCH 01/23] Use lower max threads to reduce the testing time on AIX. --- openmp/runtime/test/worksharing/for/collapse_test.inc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openmp/runtime/test/worksharing/for/collapse_test.inc b/openmp/runtime/test/worksharing/for/collapse_test.inc index 3075bd04e958f..74ec83a059d91 100644 --- a/openmp/runtime/test/worksharing/for/collapse_test.inc +++ b/openmp/runtime/test/worksharing/for/collapse_test.inc @@ -15,7 +15,12 @@ #define LOOP_TYPE2 LOOP_TYPES #define LOOP_STYPE2 LOOP_TYPES +#if defined _AIX +// Use lower max threads to reduce the testing time +#define MAX_THREADS 64 +#else #define MAX_THREADS 256 +#endif #if defined VERBOSE #define PRINTF(...) printf(__VA_ARGS__) From ecbcaa8f504f86b138202dd853403166df0f60cd Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Thu, 18 Apr 2024 10:59:41 -0400 Subject: [PATCH 02/23] Changes for cases where wint_t and wchar_t have the same width. The changes are compatible with the current IBM provided libc++. --- libcxx/include/ios | 55 +++++++++++++++++-- .../std.manip/setfill_eof.pass.cpp | 31 +++++++++++ 2 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp diff --git a/libcxx/include/ios b/libcxx/include/ios index 00c1d5c2d4bc5..bc31f30f14acf 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -224,6 +224,7 @@ storage-class-specifier const error_category& iostream_category() noexcept; #include <__system_error/error_code.h> #include <__system_error/error_condition.h> #include <__system_error/system_error.h> +#include <__type_traits/conditional.h> #include <__utility/swap.h> #include <__verbose_abort> #include @@ -521,6 +522,31 @@ inline _LIBCPP_HIDE_FROM_ABI void ios_base::exceptions(iostate __iostate) { clear(__rdstate_); } +template +// Attribute 'packed' is used to keep the layout compatible with the previous +// definition of '__set_' in basic_ios on AIX. +struct _LIBCPP_PACKED _OptionalFill { + _OptionalFill() : __set_(false) { } + _OptionalFill& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } + bool __is_set() const { return __set_; } + typename _Traits::int_type __fill() const { return __fill_val_; } + +private: + typename _Traits::int_type __fill_val_; + bool __set_; +}; + +template +struct _LIBCPP_PACKED _SentinelValueFill { + _SentinelValueFill() : __fill_val_(_Traits::eof()) { } + _SentinelValueFill& operator=(typename _Traits::int_type __x) { __fill_val_ = __x; return *this; } + bool __is_set() const { return __fill_val_ != _Traits::eof(); } + typename _Traits::int_type __fill() const { return __fill_val_; } + +private: + typename _Traits::int_type __fill_val_; +}; + template class _LIBCPP_TEMPLATE_VIS basic_ios : public ios_base { public: @@ -590,7 +616,24 @@ protected: private: basic_ostream* __tie_; - mutable int_type __fill_; + +#if defined(_AIX) || (defined(__MVS__) && defined(__64BIT__)) +// AIX and 64-bit MVS must use _OptionalFill for ABI backward compatibility. + using _FillType = _OptionalFill<_Traits>; +#else +#if defined(_WIN32) + static const bool _OptOutForABICompat = true; +#else + static const bool _OptOutForABICompat = false; +#endif + + using _FillType = _If< + sizeof(char_type) >= sizeof(int_type) && !_OptOutForABICompat, + _OptionalFill<_Traits>, + _SentinelValueFill<_Traits> + >; +#endif + mutable _FillType __fill_; }; template @@ -605,7 +648,7 @@ template inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::init(basic_streambuf* __sb) { ios_base::init(__sb); __tie_ = nullptr; - __fill_ = traits_type::eof(); + __fill_ = widen(' '); } template @@ -655,16 +698,16 @@ inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::widen(char __c) template inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::fill() const { - if (traits_type::eq_int_type(traits_type::eof(), __fill_)) + if (!__fill_.__is_set()) __fill_ = widen(' '); - return __fill_; + return __fill_.__fill(); } template inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::fill(char_type __ch) { - if (traits_type::eq_int_type(traits_type::eof(), __fill_)) + if (!__fill_.__is_set()) __fill_ = widen(' '); - char_type __r = __fill_; + char_type __r = __fill_.__fill(); __fill_ = __ch; return __r; } diff --git a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp new file mode 100644 index 0000000000000..042e07cb80bbd --- /dev/null +++ b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Test that weof as a wchar_t value can be set as the fill character. + +// UNSUPPORTED: no-wide-characters +// REQUIRES: target=powerpc{{(64)?}}-ibm-aix || target=s390x-ibm-zos + +#include +#include +#include +#include + +template +struct testbuf : public std::basic_streambuf { + testbuf() {} +}; + +int main(int, char**) { + testbuf sb; + std::wostream os(&sb); + os << std::setfill((wchar_t)std::char_traits::eof()); + assert(os.fill() == (wchar_t)std::char_traits::eof()); + + return 0; +} From a54d54a900d6da9d3164b02cb86d5379f0d70c35 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Fri, 19 Apr 2024 11:05:18 -0400 Subject: [PATCH 03/23] Addressed comments. - update a comment --- libcxx/include/ios | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcxx/include/ios b/libcxx/include/ios index bc31f30f14acf..3961504f62b39 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -524,7 +524,7 @@ inline _LIBCPP_HIDE_FROM_ABI void ios_base::exceptions(iostate __iostate) { template // Attribute 'packed' is used to keep the layout compatible with the previous -// definition of '__set_' in basic_ios on AIX. +// definition of the '__fill_' and '_set_' pair in basic_ios on AIX & z/OS. struct _LIBCPP_PACKED _OptionalFill { _OptionalFill() : __set_(false) { } _OptionalFill& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } From 8fa650aa6a5bf5caa6d235a7fe8cca93e39ad5fd Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Mon, 3 Jun 2024 13:23:10 -0400 Subject: [PATCH 04/23] Addressed comments. -define and use macros _LIBCXX_IOS_MAY_USE_OPTIONAL_FILL and _LIBCXX_IOS_FORCE_OPTIONAL_FILL. --- libcxx/include/__configuration/abi.h | 13 +++++++++++++ libcxx/include/ios | 15 +++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/libcxx/include/__configuration/abi.h b/libcxx/include/__configuration/abi.h index 17aceb042f524..b83e7bf97a559 100644 --- a/libcxx/include/__configuration/abi.h +++ b/libcxx/include/__configuration/abi.h @@ -91,6 +91,15 @@ # define _LIBCPP_ABI_USE_WRAP_ITER_IN_STD_STRING_VIEW // Dont' add an inline namespace for `std::filesystem` # define _LIBCPP_ABI_NO_FILESYSTEM_INLINE_NAMESPACE +// libcxx std::basic_ios uses WEOF to indicate that the fill value is +// uninitialized. However, on platforms where the size of char_type is +// equal to or greater than the size of int_type, +// std::char_traits::eq_int_type() cannot distinguish between WEOF +// and WCHAR_MAX. Helper class _OptionalFill is used for targets where a +// variable is needed to indicate whether the fill value has been initialized. +// Existing targets where this would break ABI compatibility can choose to keep +// the existing ABI by undefining macro _LIBCXX_IOS_MAY_USE_OPTIONAL_FILL. +# define _LIBCXX_IOS_MAY_USE_OPTIONAL_FILL #elif _LIBCPP_ABI_VERSION == 1 # if !(defined(_LIBCPP_OBJECT_FORMAT_COFF) || defined(_LIBCPP_OBJECT_FORMAT_XCOFF)) // Enable compiling copies of now inline methods into the dylib to support @@ -108,6 +117,10 @@ # if defined(__FreeBSD__) && __FreeBSD__ < 14 # define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR # endif +// AIX and 64-bit MVS must use _OptionalFill for ABI backward compatibility. +# if defined(_AIX) || (defined(__MVS__) && defined(__64BIT__)) +# define _LIBCXX_IOS_FORCE_OPTIONAL_FILL +# endif #endif // We had some bugs where we use [[no_unique_address]] together with construct_at, diff --git a/libcxx/include/ios b/libcxx/include/ios index 3961504f62b39..d056b1ccb8681 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -617,21 +617,16 @@ protected: private: basic_ostream* __tie_; -#if defined(_AIX) || (defined(__MVS__) && defined(__64BIT__)) -// AIX and 64-bit MVS must use _OptionalFill for ABI backward compatibility. +#if defined(_LIBCXX_IOS_FORCE_OPTIONAL_FILL) using _FillType = _OptionalFill<_Traits>; -#else -#if defined(_WIN32) - static const bool _OptOutForABICompat = true; -#else - static const bool _OptOutForABICompat = false; -#endif - +#elif defined(_LIBCXX_IOS_MAY_USE_OPTIONAL_FILL) using _FillType = _If< - sizeof(char_type) >= sizeof(int_type) && !_OptOutForABICompat, + sizeof(char_type) >= sizeof(int_type), _OptionalFill<_Traits>, _SentinelValueFill<_Traits> >; +#else + using _FillType = _SentinelValueFill<_Traits>; #endif mutable _FillType __fill_; }; From c033ea9b0486c5dd8a240cb01aee05848dff4a65 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Tue, 4 Jun 2024 06:51:49 -0400 Subject: [PATCH 05/23] Add _LIBCPP_HIDE_FROM_ABI. --- libcxx/include/ios | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libcxx/include/ios b/libcxx/include/ios index d056b1ccb8681..3099dbe8d9f96 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -526,10 +526,10 @@ template // Attribute 'packed' is used to keep the layout compatible with the previous // definition of the '__fill_' and '_set_' pair in basic_ios on AIX & z/OS. struct _LIBCPP_PACKED _OptionalFill { - _OptionalFill() : __set_(false) { } - _OptionalFill& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } - bool __is_set() const { return __set_; } - typename _Traits::int_type __fill() const { return __fill_val_; } + _LIBCPP_HIDE_FROM_ABI _OptionalFill() : __set_(false) { } + _LIBCPP_HIDE_FROM_ABI _OptionalFill& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } + _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __set_; } + _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } private: typename _Traits::int_type __fill_val_; @@ -538,10 +538,10 @@ private: template struct _LIBCPP_PACKED _SentinelValueFill { - _SentinelValueFill() : __fill_val_(_Traits::eof()) { } - _SentinelValueFill& operator=(typename _Traits::int_type __x) { __fill_val_ = __x; return *this; } - bool __is_set() const { return __fill_val_ != _Traits::eof(); } - typename _Traits::int_type __fill() const { return __fill_val_; } + _LIBCPP_HIDE_FROM_ABI _SentinelValueFill() : __fill_val_(_Traits::eof()) { } + _LIBCPP_HIDE_FROM_ABI _SentinelValueFill& operator=(typename _Traits::int_type __x) { __fill_val_ = __x; return *this; } + _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __fill_val_ != _Traits::eof(); } + _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } private: typename _Traits::int_type __fill_val_; From 5288cb33586bd5ac22efabfde95ff143222c366c Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Tue, 4 Jun 2024 07:08:40 -0400 Subject: [PATCH 06/23] Removed changes in unrelated test case. --- openmp/runtime/test/worksharing/for/collapse_test.inc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/openmp/runtime/test/worksharing/for/collapse_test.inc b/openmp/runtime/test/worksharing/for/collapse_test.inc index 74ec83a059d91..3075bd04e958f 100644 --- a/openmp/runtime/test/worksharing/for/collapse_test.inc +++ b/openmp/runtime/test/worksharing/for/collapse_test.inc @@ -15,12 +15,7 @@ #define LOOP_TYPE2 LOOP_TYPES #define LOOP_STYPE2 LOOP_TYPES -#if defined _AIX -// Use lower max threads to reduce the testing time -#define MAX_THREADS 64 -#else #define MAX_THREADS 256 -#endif #if defined VERBOSE #define PRINTF(...) printf(__VA_ARGS__) From 00f4cd285b2a8281168486377a170246a33e1c34 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Tue, 4 Jun 2024 12:20:39 -0400 Subject: [PATCH 07/23] Add description of ABI change in ReleaseNote. --- libcxx/docs/ReleaseNotes/19.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst index 0bc343acd281c..935d065a5e0ac 100644 --- a/libcxx/docs/ReleaseNotes/19.rst +++ b/libcxx/docs/ReleaseNotes/19.rst @@ -146,6 +146,13 @@ ABI Affecting Changes ``random_device`` could throw a ``system_error`` with this value. It now throws ``ENOMSG``. +- libcxx ``std::basic_ios`` uses ``WEOF`` to indicate that the fill value is uninitialized. However, on platforms + where the size of ``char_type`` is equal to or greater than the size of ``int_type``, + ``std::char_traits::eq_int_type()`` cannot distinguish between ``WEOF`` and ``WCHAR_MAX``. Helper + class ``_OptionalFill`` is used for targets where a variable is needed to indicate whether the fill value + has been initialized. This is an ABI break on platforms where the size of ``char_type`` is equal to or greater + than the size of ``int_type``. Existing targets affected by this change can choose to keep the existing ABI + by undefining macro ``_LIBCXX_IOS_MAY_USE_OPTIONAL_FILL``. Build System Changes -------------------- From e71aafc0a3e39773b4e3c4a5f79bd8aa3a5fcf14 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Wed, 5 Jun 2024 11:07:47 -0400 Subject: [PATCH 08/23] Address comment. - expect the test case to pass except windows in abi version 1. --- .../input.output/iostream.format/std.manip/setfill_eof.pass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp index 042e07cb80bbd..6cf27ac2de103 100644 --- a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp @@ -9,7 +9,7 @@ // Test that weof as a wchar_t value can be set as the fill character. // UNSUPPORTED: no-wide-characters -// REQUIRES: target=powerpc{{(64)?}}-ibm-aix || target=s390x-ibm-zos +// XFAIL: target=={{.+}}-windows-{{.+}} && stdlib=libc++ && libcpp-abi-version=1 #include #include From b2ba84cd16831abe195b812936cca01e9480c0b0 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Fri, 7 Jun 2024 13:10:59 -0400 Subject: [PATCH 09/23] Use helper class _FillHelper by default in ABI version 2. --- libcxx/docs/ReleaseNotes/19.rst | 11 +++++------ libcxx/include/__configuration/abi.h | 17 +++++++++-------- libcxx/include/ios | 17 +++++------------ .../std.manip/setfill_eof.pass.cpp | 2 +- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst index 935d065a5e0ac..678f99c60fd81 100644 --- a/libcxx/docs/ReleaseNotes/19.rst +++ b/libcxx/docs/ReleaseNotes/19.rst @@ -147,12 +147,11 @@ ABI Affecting Changes throws ``ENOMSG``. - libcxx ``std::basic_ios`` uses ``WEOF`` to indicate that the fill value is uninitialized. However, on platforms - where the size of ``char_type`` is equal to or greater than the size of ``int_type``, - ``std::char_traits::eq_int_type()`` cannot distinguish between ``WEOF`` and ``WCHAR_MAX``. Helper - class ``_OptionalFill`` is used for targets where a variable is needed to indicate whether the fill value - has been initialized. This is an ABI break on platforms where the size of ``char_type`` is equal to or greater - than the size of ``int_type``. Existing targets affected by this change can choose to keep the existing ABI - by undefining macro ``_LIBCXX_IOS_MAY_USE_OPTIONAL_FILL``. + where the size of ``char_type`` is equal to or greater than the size of ``int_type`` and ``char_type`` is unsigned, + ``std::char_traits::eq_int_type()`` cannot distinguish between ``WEOF`` and ``WCHAR_MAX``. New helper + class ``_FillHelper`` uses a boolean variable to indicate whether the fill value has been initialized so that a fill + value ``WEOF`` set by the user won't be treated as indicating the fill value is uninitialized. + Undefining macro ``_LIBCXX_IOS_USE_FILL_HELPER`` to keep the ABI verson 1 behavior if needed. Build System Changes -------------------- diff --git a/libcxx/include/__configuration/abi.h b/libcxx/include/__configuration/abi.h index b83e7bf97a559..646ec3100a8dd 100644 --- a/libcxx/include/__configuration/abi.h +++ b/libcxx/include/__configuration/abi.h @@ -93,13 +93,14 @@ # define _LIBCPP_ABI_NO_FILESYSTEM_INLINE_NAMESPACE // libcxx std::basic_ios uses WEOF to indicate that the fill value is // uninitialized. However, on platforms where the size of char_type is -// equal to or greater than the size of int_type, +// equal to or greater than the size of int_type and char_type is unsigned, // std::char_traits::eq_int_type() cannot distinguish between WEOF -// and WCHAR_MAX. Helper class _OptionalFill is used for targets where a -// variable is needed to indicate whether the fill value has been initialized. -// Existing targets where this would break ABI compatibility can choose to keep -// the existing ABI by undefining macro _LIBCXX_IOS_MAY_USE_OPTIONAL_FILL. -# define _LIBCXX_IOS_MAY_USE_OPTIONAL_FILL +// and WCHAR_MAX. New helper class _FillHelper uses a boolean variable to indicate +// whether the fill value has been initialized so that a fill value WEOF set +// by the user won't be treated as indicating the fill value is uninitialized. +// Undefining macro _LIBCXX_IOS_USE_FILL_HELPER to keep the ABI verson 1 +// behavior if needed. +# define _LIBCXX_IOS_USE_FILL_HELPER #elif _LIBCPP_ABI_VERSION == 1 # if !(defined(_LIBCPP_OBJECT_FORMAT_COFF) || defined(_LIBCPP_OBJECT_FORMAT_XCOFF)) // Enable compiling copies of now inline methods into the dylib to support @@ -117,9 +118,9 @@ # if defined(__FreeBSD__) && __FreeBSD__ < 14 # define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR # endif -// AIX and 64-bit MVS must use _OptionalFill for ABI backward compatibility. +// AIX and 64-bit MVS must use _FillHelper for ABI backward compatibility. # if defined(_AIX) || (defined(__MVS__) && defined(__64BIT__)) -# define _LIBCXX_IOS_FORCE_OPTIONAL_FILL +# define _LIBCXX_IOS_USE_FILL_HELPER # endif #endif diff --git a/libcxx/include/ios b/libcxx/include/ios index 3099dbe8d9f96..6ccef00358530 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -525,9 +525,9 @@ inline _LIBCPP_HIDE_FROM_ABI void ios_base::exceptions(iostate __iostate) { template // Attribute 'packed' is used to keep the layout compatible with the previous // definition of the '__fill_' and '_set_' pair in basic_ios on AIX & z/OS. -struct _LIBCPP_PACKED _OptionalFill { - _LIBCPP_HIDE_FROM_ABI _OptionalFill() : __set_(false) { } - _LIBCPP_HIDE_FROM_ABI _OptionalFill& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } +struct _LIBCPP_PACKED _FillHelper { + _LIBCPP_HIDE_FROM_ABI _FillHelper() : __set_(false) { } + _LIBCPP_HIDE_FROM_ABI _FillHelper& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __set_; } _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } @@ -617,14 +617,8 @@ protected: private: basic_ostream* __tie_; -#if defined(_LIBCXX_IOS_FORCE_OPTIONAL_FILL) - using _FillType = _OptionalFill<_Traits>; -#elif defined(_LIBCXX_IOS_MAY_USE_OPTIONAL_FILL) - using _FillType = _If< - sizeof(char_type) >= sizeof(int_type), - _OptionalFill<_Traits>, - _SentinelValueFill<_Traits> - >; +#if defined(_LIBCXX_IOS_USE_FILL_HELPER) + using _FillType = _FillHelper<_Traits>; #else using _FillType = _SentinelValueFill<_Traits>; #endif @@ -643,7 +637,6 @@ template inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::init(basic_streambuf* __sb) { ios_base::init(__sb); __tie_ = nullptr; - __fill_ = widen(' '); } template diff --git a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp index 6cf27ac2de103..66b8d0314799a 100644 --- a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp @@ -9,7 +9,7 @@ // Test that weof as a wchar_t value can be set as the fill character. // UNSUPPORTED: no-wide-characters -// XFAIL: target=={{.+}}-windows-{{.+}} && stdlib=libc++ && libcpp-abi-version=1 +// REQUIRES: target=powerpc{{(64)?}}-ibm-aix || target=s390x-ibm-zos || libcpp-abi-version=2 #include #include From 33e58edb18cd607db0b7754caddd5ff1620fc826 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Fri, 7 Jun 2024 14:16:39 -0400 Subject: [PATCH 10/23] Remove unnecessary include of __type_traits/conditional.h. --- libcxx/include/ios | 1 - 1 file changed, 1 deletion(-) diff --git a/libcxx/include/ios b/libcxx/include/ios index 6ccef00358530..4ffba6bda93e1 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -224,7 +224,6 @@ storage-class-specifier const error_category& iostream_category() noexcept; #include <__system_error/error_code.h> #include <__system_error/error_condition.h> #include <__system_error/system_error.h> -#include <__type_traits/conditional.h> #include <__utility/swap.h> #include <__verbose_abort> #include From 933f8880ec8bf2925a12bf4f82ae427becc3c87b Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Tue, 11 Jun 2024 12:13:54 -0400 Subject: [PATCH 11/23] Addressed comments. - add note that the change only affect ABI version 2 - remove "undefining _LIBCXX_IOS_USE_FILL_HELPER to keep the ABI verson 1 behavior" - add init() functions for class _FillHelper and _SentinelValueFill --- libcxx/docs/ReleaseNotes/19.rst | 15 +++++++++------ libcxx/include/__configuration/abi.h | 2 -- libcxx/include/ios | 5 +++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst index 678f99c60fd81..1684551cbe4a8 100644 --- a/libcxx/docs/ReleaseNotes/19.rst +++ b/libcxx/docs/ReleaseNotes/19.rst @@ -146,12 +146,15 @@ ABI Affecting Changes ``random_device`` could throw a ``system_error`` with this value. It now throws ``ENOMSG``. -- libcxx ``std::basic_ios`` uses ``WEOF`` to indicate that the fill value is uninitialized. However, on platforms - where the size of ``char_type`` is equal to or greater than the size of ``int_type`` and ``char_type`` is unsigned, - ``std::char_traits::eq_int_type()`` cannot distinguish between ``WEOF`` and ``WCHAR_MAX``. New helper - class ``_FillHelper`` uses a boolean variable to indicate whether the fill value has been initialized so that a fill - value ``WEOF`` set by the user won't be treated as indicating the fill value is uninitialized. - Undefining macro ``_LIBCXX_IOS_USE_FILL_HELPER`` to keep the ABI verson 1 behavior if needed. +- libcxx ``std::basic_ios`` uses ``WEOF`` to indicate that the fill value is + uninitialized. However, on platforms where the size of ``char_type`` is + equal to or greater than the size of ``int_type`` and ``char_type`` is + unsigned, ``std::char_traits::eq_int_type()`` cannot distinguish + between ``WEOF`` and ``WCHAR_MAX``. Helper class ``_FillHelper`` is + added where a boolean variable is used to indicate whether the fill value + has been initialized so that a fill value ``WEOF`` set by the user won't be + treated as indicating the fill value is uninitialized. ``_FillHelper`` is + used in ABI version 2 and does not affect ABI version 1. Build System Changes -------------------- diff --git a/libcxx/include/__configuration/abi.h b/libcxx/include/__configuration/abi.h index 646ec3100a8dd..051425f78a9a6 100644 --- a/libcxx/include/__configuration/abi.h +++ b/libcxx/include/__configuration/abi.h @@ -98,8 +98,6 @@ // and WCHAR_MAX. New helper class _FillHelper uses a boolean variable to indicate // whether the fill value has been initialized so that a fill value WEOF set // by the user won't be treated as indicating the fill value is uninitialized. -// Undefining macro _LIBCXX_IOS_USE_FILL_HELPER to keep the ABI verson 1 -// behavior if needed. # define _LIBCXX_IOS_USE_FILL_HELPER #elif _LIBCPP_ABI_VERSION == 1 # if !(defined(_LIBCPP_OBJECT_FORMAT_COFF) || defined(_LIBCPP_OBJECT_FORMAT_XCOFF)) diff --git a/libcxx/include/ios b/libcxx/include/ios index 4ffba6bda93e1..b7d1f2750c75b 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -525,7 +525,7 @@ template // Attribute 'packed' is used to keep the layout compatible with the previous // definition of the '__fill_' and '_set_' pair in basic_ios on AIX & z/OS. struct _LIBCPP_PACKED _FillHelper { - _LIBCPP_HIDE_FROM_ABI _FillHelper() : __set_(false) { } + _LIBCPP_HIDE_FROM_ABI void init() { __set_ = false; } _LIBCPP_HIDE_FROM_ABI _FillHelper& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __set_; } _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } @@ -537,7 +537,7 @@ private: template struct _LIBCPP_PACKED _SentinelValueFill { - _LIBCPP_HIDE_FROM_ABI _SentinelValueFill() : __fill_val_(_Traits::eof()) { } + _LIBCPP_HIDE_FROM_ABI void init() { __fill_val_ = _Traits::eof(); } _LIBCPP_HIDE_FROM_ABI _SentinelValueFill& operator=(typename _Traits::int_type __x) { __fill_val_ = __x; return *this; } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __fill_val_ != _Traits::eof(); } _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } @@ -636,6 +636,7 @@ template inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::init(basic_streambuf* __sb) { ios_base::init(__sb); __tie_ = nullptr; + __fill_.init(); } template From 7ef7b825b1de1f11179ace3298469a13c39299ac Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Tue, 11 Jun 2024 13:26:49 -0400 Subject: [PATCH 12/23] Rename init() to __init(). --- libcxx/include/ios | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libcxx/include/ios b/libcxx/include/ios index b7d1f2750c75b..6db8711139606 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -525,7 +525,7 @@ template // Attribute 'packed' is used to keep the layout compatible with the previous // definition of the '__fill_' and '_set_' pair in basic_ios on AIX & z/OS. struct _LIBCPP_PACKED _FillHelper { - _LIBCPP_HIDE_FROM_ABI void init() { __set_ = false; } + _LIBCPP_HIDE_FROM_ABI void __init() { __set_ = false; } _LIBCPP_HIDE_FROM_ABI _FillHelper& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __set_; } _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } @@ -537,7 +537,7 @@ private: template struct _LIBCPP_PACKED _SentinelValueFill { - _LIBCPP_HIDE_FROM_ABI void init() { __fill_val_ = _Traits::eof(); } + _LIBCPP_HIDE_FROM_ABI void __init() { __fill_val_ = _Traits::eof(); } _LIBCPP_HIDE_FROM_ABI _SentinelValueFill& operator=(typename _Traits::int_type __x) { __fill_val_ = __x; return *this; } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __fill_val_ != _Traits::eof(); } _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } @@ -636,7 +636,7 @@ template inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::init(basic_streambuf* __sb) { ios_base::init(__sb); __tie_ = nullptr; - __fill_.init(); + __fill_.__init(); } template From 9c493f34b72c94343d109e5d0ef473d7f443fbad Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Fri, 14 Jun 2024 11:33:05 -0400 Subject: [PATCH 13/23] Addressed comments. - Use traits_type instead of _Traits to be consistent. --- libcxx/include/ios | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libcxx/include/ios b/libcxx/include/ios index 6db8711139606..6535216fcfb19 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -617,9 +617,9 @@ private: basic_ostream* __tie_; #if defined(_LIBCXX_IOS_USE_FILL_HELPER) - using _FillType = _FillHelper<_Traits>; + using _FillType = _FillHelper; #else - using _FillType = _SentinelValueFill<_Traits>; + using _FillType = _SentinelValueFill; #endif mutable _FillType __fill_; }; From a9280c0db10950246d3fde5b2876aa25dd993cc7 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Thu, 4 Jul 2024 15:33:38 -0400 Subject: [PATCH 14/23] Update libcxx/include/__configuration/abi.h Co-authored-by: Louis Dionne --- libcxx/include/__configuration/abi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcxx/include/__configuration/abi.h b/libcxx/include/__configuration/abi.h index 051425f78a9a6..6155013f3bcfa 100644 --- a/libcxx/include/__configuration/abi.h +++ b/libcxx/include/__configuration/abi.h @@ -91,7 +91,7 @@ # define _LIBCPP_ABI_USE_WRAP_ITER_IN_STD_STRING_VIEW // Dont' add an inline namespace for `std::filesystem` # define _LIBCPP_ABI_NO_FILESYSTEM_INLINE_NAMESPACE -// libcxx std::basic_ios uses WEOF to indicate that the fill value is +// std::basic_ios uses WEOF to indicate that the fill value is // uninitialized. However, on platforms where the size of char_type is // equal to or greater than the size of int_type and char_type is unsigned, // std::char_traits::eq_int_type() cannot distinguish between WEOF From 68edd80a02eab9f2d71a0e1e88f65c70d642f1b9 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Thu, 4 Jul 2024 15:35:20 -0400 Subject: [PATCH 15/23] Update libcxx/include/__configuration/abi.h Co-authored-by: Louis Dionne --- libcxx/include/__configuration/abi.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libcxx/include/__configuration/abi.h b/libcxx/include/__configuration/abi.h index 6155013f3bcfa..e071b9fe7e13e 100644 --- a/libcxx/include/__configuration/abi.h +++ b/libcxx/include/__configuration/abi.h @@ -95,9 +95,8 @@ // uninitialized. However, on platforms where the size of char_type is // equal to or greater than the size of int_type and char_type is unsigned, // std::char_traits::eq_int_type() cannot distinguish between WEOF -// and WCHAR_MAX. New helper class _FillHelper uses a boolean variable to indicate -// whether the fill value has been initialized so that a fill value WEOF set -// by the user won't be treated as indicating the fill value is uninitialized. +// and WCHAR_MAX. This ABI setting determines whether we should instead track whether the fill +// value has been initialized using a separate boolean, which changes the ABI. # define _LIBCXX_IOS_USE_FILL_HELPER #elif _LIBCPP_ABI_VERSION == 1 # if !(defined(_LIBCPP_OBJECT_FORMAT_COFF) || defined(_LIBCPP_OBJECT_FORMAT_XCOFF)) From c0f97c32fc33559d11404c1d45fa98d5f4a2e719 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Thu, 4 Jul 2024 15:36:26 -0400 Subject: [PATCH 16/23] Update libcxx/include/__configuration/abi.h Co-authored-by: Louis Dionne --- libcxx/include/__configuration/abi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcxx/include/__configuration/abi.h b/libcxx/include/__configuration/abi.h index e071b9fe7e13e..213ff2d366268 100644 --- a/libcxx/include/__configuration/abi.h +++ b/libcxx/include/__configuration/abi.h @@ -97,7 +97,7 @@ // std::char_traits::eq_int_type() cannot distinguish between WEOF // and WCHAR_MAX. This ABI setting determines whether we should instead track whether the fill // value has been initialized using a separate boolean, which changes the ABI. -# define _LIBCXX_IOS_USE_FILL_HELPER +# define _LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE #elif _LIBCPP_ABI_VERSION == 1 # if !(defined(_LIBCPP_OBJECT_FORMAT_COFF) || defined(_LIBCPP_OBJECT_FORMAT_XCOFF)) // Enable compiling copies of now inline methods into the dylib to support From 49f202f4d84fb7517765db7c2fdb12fd01e3a5fd Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Thu, 4 Jul 2024 15:36:57 -0400 Subject: [PATCH 17/23] Update libcxx/include/ios Co-authored-by: Louis Dionne --- libcxx/include/ios | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcxx/include/ios b/libcxx/include/ios index 6535216fcfb19..6996a103e6958 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -528,7 +528,7 @@ struct _LIBCPP_PACKED _FillHelper { _LIBCPP_HIDE_FROM_ABI void __init() { __set_ = false; } _LIBCPP_HIDE_FROM_ABI _FillHelper& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __set_; } - _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } + _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __get() const { return __fill_val_; } private: typename _Traits::int_type __fill_val_; From 29a463543abf3b800f817c386aa1c3b0d5ff7703 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Thu, 4 Jul 2024 18:26:31 -0400 Subject: [PATCH 18/23] Addressed comments. - set cmake variable LIBCXX_ABI_DEFINES with the ABI macro for AIX and zOS 64-bit - remove the note for this change from the release note. - rename function name __fill() to __get() - remove REQUIRES from the test case. --- libcxx/cmake/caches/AIX.cmake | 1 + libcxx/cmake/caches/s390x-ibm-zos-ascii.cmake | 1 + libcxx/cmake/caches/s390x-ibm-zos.cmake | 1 + libcxx/docs/ReleaseNotes/19.rst | 10 ---------- libcxx/include/ios | 8 ++++---- .../iostream.format/std.manip/setfill_eof.pass.cpp | 1 - 6 files changed, 7 insertions(+), 15 deletions(-) diff --git a/libcxx/cmake/caches/AIX.cmake b/libcxx/cmake/caches/AIX.cmake index c01aa5b14df06..4ec78f9bbd592 100644 --- a/libcxx/cmake/caches/AIX.cmake +++ b/libcxx/cmake/caches/AIX.cmake @@ -15,3 +15,4 @@ set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "") set(LIBCXX_CXX_ABI libcxxabi CACHE STRING "") set(LIBUNWIND_ENABLE_SHARED ON CACHE BOOL "") set(LIBUNWIND_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXX_ABI_DEFINES "_LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE" CACHE STRING "") diff --git a/libcxx/cmake/caches/s390x-ibm-zos-ascii.cmake b/libcxx/cmake/caches/s390x-ibm-zos-ascii.cmake index 95b7cbe776e05..68b1cc8eff9b0 100644 --- a/libcxx/cmake/caches/s390x-ibm-zos-ascii.cmake +++ b/libcxx/cmake/caches/s390x-ibm-zos-ascii.cmake @@ -20,3 +20,4 @@ set(LIBCXX_CXX_ABI system-libcxxabi CACHE STRING "") set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "-fzos-le-char-mode=ascii" CACHE STRING "") set(LIBCXX_ADDITIONAL_LIBRARIES "-L../s390x-ibm-zos/lib -Wl,../s390x-ibm-zos/lib/libunwind.x" CACHE STRING "") +set(LIBCXX_ABI_DEFINES "_LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE" CACHE STRING "") diff --git a/libcxx/cmake/caches/s390x-ibm-zos.cmake b/libcxx/cmake/caches/s390x-ibm-zos.cmake index 3eaed3e67fc16..e51d5ff31ebfe 100644 --- a/libcxx/cmake/caches/s390x-ibm-zos.cmake +++ b/libcxx/cmake/caches/s390x-ibm-zos.cmake @@ -15,3 +15,4 @@ set(LIBCXX_DLL_NAME CRTEQCXE CACHE STRING "") set(LIBCXXABI_DLL_NAME CRTEQCXA CACHE STRING "") set(LIBCXXABI_ADDITIONAL_LIBRARIES "-Wl,lib/libunwind.x" CACHE STRING "") +set(LIBCXX_ABI_DEFINES "_LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE" CACHE STRING "") diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst index 1684551cbe4a8..73dfebe8c1a51 100644 --- a/libcxx/docs/ReleaseNotes/19.rst +++ b/libcxx/docs/ReleaseNotes/19.rst @@ -146,16 +146,6 @@ ABI Affecting Changes ``random_device`` could throw a ``system_error`` with this value. It now throws ``ENOMSG``. -- libcxx ``std::basic_ios`` uses ``WEOF`` to indicate that the fill value is - uninitialized. However, on platforms where the size of ``char_type`` is - equal to or greater than the size of ``int_type`` and ``char_type`` is - unsigned, ``std::char_traits::eq_int_type()`` cannot distinguish - between ``WEOF`` and ``WCHAR_MAX``. Helper class ``_FillHelper`` is - added where a boolean variable is used to indicate whether the fill value - has been initialized so that a fill value ``WEOF`` set by the user won't be - treated as indicating the fill value is uninitialized. ``_FillHelper`` is - used in ABI version 2 and does not affect ABI version 1. - Build System Changes -------------------- diff --git a/libcxx/include/ios b/libcxx/include/ios index 6996a103e6958..4af04fbd10e02 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -540,7 +540,7 @@ struct _LIBCPP_PACKED _SentinelValueFill { _LIBCPP_HIDE_FROM_ABI void __init() { __fill_val_ = _Traits::eof(); } _LIBCPP_HIDE_FROM_ABI _SentinelValueFill& operator=(typename _Traits::int_type __x) { __fill_val_ = __x; return *this; } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __fill_val_ != _Traits::eof(); } - _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __fill() const { return __fill_val_; } + _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __get() const { return __fill_val_; } private: typename _Traits::int_type __fill_val_; @@ -616,7 +616,7 @@ protected: private: basic_ostream* __tie_; -#if defined(_LIBCXX_IOS_USE_FILL_HELPER) +#if defined(_LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE) using _FillType = _FillHelper; #else using _FillType = _SentinelValueFill; @@ -688,14 +688,14 @@ template inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::fill() const { if (!__fill_.__is_set()) __fill_ = widen(' '); - return __fill_.__fill(); + return __fill_.__get(); } template inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::fill(char_type __ch) { if (!__fill_.__is_set()) __fill_ = widen(' '); - char_type __r = __fill_.__fill(); + char_type __r = __fill_.__get(); __fill_ = __ch; return __r; } diff --git a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp index 66b8d0314799a..00d070ac77ca6 100644 --- a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp @@ -9,7 +9,6 @@ // Test that weof as a wchar_t value can be set as the fill character. // UNSUPPORTED: no-wide-characters -// REQUIRES: target=powerpc{{(64)?}}-ibm-aix || target=s390x-ibm-zos || libcpp-abi-version=2 #include #include From 88fc9eb67efa469aeb5a4b370cfe69b9a7832a77 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Thu, 4 Jul 2024 18:35:47 -0400 Subject: [PATCH 19/23] Remove the unused macro definition for AIX/zOS in abi.h. --- libcxx/docs/ReleaseNotes/19.rst | 1 + libcxx/include/__configuration/abi.h | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst index 73dfebe8c1a51..0bc343acd281c 100644 --- a/libcxx/docs/ReleaseNotes/19.rst +++ b/libcxx/docs/ReleaseNotes/19.rst @@ -146,6 +146,7 @@ ABI Affecting Changes ``random_device`` could throw a ``system_error`` with this value. It now throws ``ENOMSG``. + Build System Changes -------------------- diff --git a/libcxx/include/__configuration/abi.h b/libcxx/include/__configuration/abi.h index 213ff2d366268..1a28839884b27 100644 --- a/libcxx/include/__configuration/abi.h +++ b/libcxx/include/__configuration/abi.h @@ -115,10 +115,6 @@ # if defined(__FreeBSD__) && __FreeBSD__ < 14 # define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR # endif -// AIX and 64-bit MVS must use _FillHelper for ABI backward compatibility. -# if defined(_AIX) || (defined(__MVS__) && defined(__64BIT__)) -# define _LIBCXX_IOS_USE_FILL_HELPER -# endif #endif // We had some bugs where we use [[no_unique_address]] together with construct_at, From 9ea946ee9e42305f5fbde72d19e08e31cc4f9467 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Fri, 12 Jul 2024 14:35:51 +0000 Subject: [PATCH 20/23] setfill() WCHAR_MAX instead of WEOF for the test. --- .../{setfill_eof.pass.cpp => setfill_wchar_max.pass.cpp} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename libcxx/test/std/input.output/iostream.format/std.manip/{setfill_eof.pass.cpp => setfill_wchar_max.pass.cpp} (76%) diff --git a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp similarity index 76% rename from libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp rename to libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp index 00d070ac77ca6..40033c8d28dc6 100644 --- a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_eof.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// Test that weof as a wchar_t value can be set as the fill character. +// Test that WCHAR_MAX as a wchar_t value can be set as the fill character. // UNSUPPORTED: no-wide-characters @@ -23,8 +23,8 @@ struct testbuf : public std::basic_streambuf { int main(int, char**) { testbuf sb; std::wostream os(&sb); - os << std::setfill((wchar_t)std::char_traits::eof()); - assert(os.fill() == (wchar_t)std::char_traits::eof()); + os << std::setfill((wchar_t)WCHAR_MAX); + assert(os.fill() == (wchar_t)WCHAR_MAX); return 0; } From bf8e9232854b2b57c8000859a1eeb542f721acd7 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Fri, 12 Jul 2024 15:35:40 +0000 Subject: [PATCH 21/23] Fixed format. --- libcxx/include/ios | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libcxx/include/ios b/libcxx/include/ios index 544b2195a874c..6c786892e1d43 100644 --- a/libcxx/include/ios +++ b/libcxx/include/ios @@ -526,7 +526,11 @@ template // definition of the '__fill_' and '_set_' pair in basic_ios on AIX & z/OS. struct _LIBCPP_PACKED _FillHelper { _LIBCPP_HIDE_FROM_ABI void __init() { __set_ = false; } - _LIBCPP_HIDE_FROM_ABI _FillHelper& operator=(typename _Traits::int_type __x) { __set_ = true; __fill_val_ = __x; return *this; } + _LIBCPP_HIDE_FROM_ABI _FillHelper& operator=(typename _Traits::int_type __x) { + __set_ = true; + __fill_val_ = __x; + return *this; + } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __set_; } _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __get() const { return __fill_val_; } @@ -538,7 +542,10 @@ private: template struct _LIBCPP_PACKED _SentinelValueFill { _LIBCPP_HIDE_FROM_ABI void __init() { __fill_val_ = _Traits::eof(); } - _LIBCPP_HIDE_FROM_ABI _SentinelValueFill& operator=(typename _Traits::int_type __x) { __fill_val_ = __x; return *this; } + _LIBCPP_HIDE_FROM_ABI _SentinelValueFill& operator=(typename _Traits::int_type __x) { + __fill_val_ = __x; + return *this; + } _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __fill_val_ != _Traits::eof(); } _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __get() const { return __fill_val_; } From ab1cbf75b3abb9b99c0a2efeee63df4cc9f0f82d Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Mon, 15 Jul 2024 15:47:12 +0000 Subject: [PATCH 22/23] XFAIL targets where WEOF is the same as WCHAR_MAX in libcpp ABI version 1. --- .../iostream.format/std.manip/setfill_wchar_max.pass.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp index 40033c8d28dc6..3fc460ff45cc7 100644 --- a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp @@ -10,6 +10,14 @@ // UNSUPPORTED: no-wide-characters +// Expect the test case to fail on targets where WEOF is the same as +// WCHAR_MAX with the libcpp ABI version 1 implementation. The libcpp ABI +// version 2 implementation fixes the problem. + +// XFAIL: target={{.*}}-windows{{.*}} && libcpp-abi-version=1 +// XFAIL: target=armv{{71|81}}-linux-gnueabihf && libcpp-abi-version=1 +// XFAIL: target=aarch64-linux-gnu && libcpp-abi-version=1 + #include #include #include From 5338b67a10ec807180b207f52cf889b546a8613e Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Mon, 15 Jul 2024 16:57:02 -0400 Subject: [PATCH 23/23] Update libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp Co-authored-by: David Tenty --- .../iostream.format/std.manip/setfill_wchar_max.pass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp index 3fc460ff45cc7..f22850877dd62 100644 --- a/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/std.manip/setfill_wchar_max.pass.cpp @@ -15,7 +15,7 @@ // version 2 implementation fixes the problem. // XFAIL: target={{.*}}-windows{{.*}} && libcpp-abi-version=1 -// XFAIL: target=armv{{71|81}}-linux-gnueabihf && libcpp-abi-version=1 +// XFAIL: target=armv{{7|8}}l-linux-gnueabihf && libcpp-abi-version=1 // XFAIL: target=aarch64-linux-gnu && libcpp-abi-version=1 #include