diff --git a/libcxx/include/complex b/libcxx/include/complex --- a/libcxx/include/complex +++ b/libcxx/include/complex @@ -244,6 +244,7 @@ #include #include #include +#include #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -1441,7 +1442,12 @@ basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) { - return __os << '(' << __x.real() << ',' << __x.imag() << ')'; + basic_ostringstream<_CharT, _Traits> __s; + __s.flags(__os.flags()); + __s.imbue(__os.getloc()); + __s.precision(__os.precision()); + __s << '(' << __x.real() << ',' << __x.imag() << ')'; + return __os << __s.str(); } #if _LIBCPP_STD_VER > 11 diff --git a/libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp b/libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp --- a/libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp +++ b/libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp @@ -20,10 +20,20 @@ int main(int, char**) { - std::complex c(1, 2); - std::ostringstream os; - os << c; - assert(os.str() == "(1,2)"); + { + std::complex c(1, 2); + std::ostringstream os; + os << c; + assert(os.str() == "(1,2)"); + } + { + std::complex c(1, 2); + std::ostringstream os; + os.width(8); + os.fill('_'); + os << c; + assert(os.str() == "___(1,2)"); + } return 0; }