[libcxx-commits] [PATCH] D124555: [libcxx][AIX][z/OS] basic_ios<wchar_t> cannot store fill character WCHAR_MAX
Chris Bowler via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jun 8 14:48:25 PDT 2022
cebowleratibm added a comment.
using _FillType = _If<sizeof(char_type) >= sizeof(typename traits_type::int_type) && !_OptOutForABICompat, _OptionalFill<_Traits>, _SentinelValueFill<_Traits> >;
The problem isn't necessarily exposed based on the type size. For example: if wchar is 4 bytes signed then WCHAR_MAX is 0x7fffffff and WEOF is 0xffffffff so the sentinel value can be represented.
I suggest:
using _FillType = _If<traits_type::eq_int_type(std::numeric_limits<char_type>::max(), traits_type::eof) && !_OptOutForABICompat, _OptionalFill<_Traits>, _SentinelValueFill<_Traits> >;
================
Comment at: libcxx/include/ios:707
__tie_ = nullptr;
__fill_ = traits_type::eof();
+#if defined(_LIBCPP_BASIC_IOS_HAS_FILL_SET)
----------------
ldionne wrote:
> Do we need to set the `__fill_` when we use `__fill_set_`?
I agree, we don't have to initialize `__fill_` if we have `__fill_set_`. I was trying to mitigate the need to check `__fill_set_` elsewhere but I think we will always need to on the first call.
================
Comment at: libcxx/include/ios:782
{
if (traits_type::eq_int_type(traits_type::eof(), __fill_))
+ {
----------------
ldionne wrote:
> When we use `__fill_set_`, isn't this condition redundant?
I wrote it this way to mitigate the need to check the `__fill_set_` member to minimize the impact of the ABI breakage. The only case you really need to check `__fill_set` is if the fill charafter was is eof.
Reflecting now I think the effort was misguided because you're always going to get in here on the first call to `fill`. Probably better to keep it simple than get cute.
================
Comment at: libcxx/test/std/input.output/iostream.format/std.manip/setfill_wcharmax.pass.cpp:9-12
+// XFAIL: stdlib=libc++ && target=aarch64-linux-gnu
+// XFAIL: stdlib=libc++ && target=armv7l-linux-gnueabihf
+// XFAIL: stdlib=libc++ && target=armv8l-linux-gnueabihf
+// XFAIL: stdlib=libc++ && target=x86_64-pc-windows-msvc
----------------
ldionne wrote:
> Do I understand correctly that all of those targets currently have a bug that one can't set a fill char to `WCHAR_MAX`, however fixing that requires breaking the ABI?
Those were all the targets the failed the new test via the CI when I submitted the first version of the patch. I believe these targets will need to break the ABI if they want the fix.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124555/new/
https://reviews.llvm.org/D124555
More information about the libcxx-commits
mailing list