diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7ce62eae77b..0c7a62dc390 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2011-12-02 Paolo Carlini + + * include/std/iomanip (put_money): Fix thinko, use __err local, + like in, eg, basic_ostream::_M_insert. + 2011-11-30 Benjamin Kosnik * acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Remove diff --git a/libstdc++-v3/include/std/iomanip b/libstdc++-v3/include/std/iomanip index e725b2514df..840d7566209 100644 --- a/libstdc++-v3/include/std/iomanip +++ b/libstdc++-v3/include/std/iomanip @@ -282,7 +282,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } __catch(...) { __is._M_setstate(ios_base::badbit); } - if (ios_base::goodbit != __err) + if (__err) __is.setstate(__err); } return __is; @@ -312,15 +312,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typename basic_ostream<_CharT, _Traits>::sentry __cerb(__os); if (__cerb) { + ios_base::iostate __err = ios_base::goodbit; __try { typedef ostreambuf_iterator<_CharT, _Traits> _Iter; typedef money_put<_CharT, _Iter> _MoneyPut; + const _MoneyPut& __mp = use_facet<_MoneyPut>(__os.getloc()); - const _Iter __end = __mp.put(_Iter(__os.rdbuf()), __f._M_intl, - __os, __os.fill(), __f._M_mon); - if (__end.failed()) - __os.setstate(ios_base::badbit); + if (__mp.put(_Iter(__os.rdbuf()), __f._M_intl, __os, + __os.fill(), __f._M_mon).failed()) + __err |= ios_base::badbit; } __catch(__cxxabiv1::__forced_unwind&) { @@ -329,6 +330,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } __catch(...) { __os._M_setstate(ios_base::badbit); } + if (__err) + __os.setstate(__err); } return __os; }