[libc++] Fix ostream for complex numbers with fixed field width

The ostream operator<< is currently broken for std::complex with
specified field widths.

This patch a partial revert of c3478eff7a (reviewed as D71214),
restoring the correct behavior.

Differential Revision: https://reviews.llvm.org/D78816
This commit is contained in:
Antonio Sanchez 2020-05-07 13:49:12 -04:00 committed by Louis Dionne
parent 4356aa20bc
commit aa0b991dcf
2 changed files with 21 additions and 5 deletions

View File

@ -244,6 +244,7 @@ template<class T, class charT, class traits>
#include <stdexcept>
#include <cmath>
#include <iosfwd>
#include <sstream>
#include <version>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@ -1441,7 +1442,12 @@ template<class _Tp, class _CharT, class _Traits>
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

View File

@ -20,10 +20,20 @@
int main(int, char**)
{
std::complex<double> c(1, 2);
std::ostringstream os;
os << c;
assert(os.str() == "(1,2)");
{
std::complex<double> c(1, 2);
std::ostringstream os;
os << c;
assert(os.str() == "(1,2)");
}
{
std::complex<double> c(1, 2);
std::ostringstream os;
os.width(8);
os.fill('_');
os << c;
assert(os.str() == "___(1,2)");
}
return 0;
}