Patchwork [v3] Fix libstdc++/51288 thinko

login
register
mail settings
Submitter Paolo Carlini
Date Dec. 2, 2011, 5:03 p.m.
Message ID <4ED904E4.9020109@oracle.com>
Download mbox | patch
Permalink /patch/128921/
State New
Headers show

Comments

Paolo Carlini - Dec. 2, 2011, 5:03 p.m.
Hi,

this fixes a thinko in my recent fix for the PR: just be consistent with 
our other inserters.

Testing x86_64-linux, will commit soon.

Thanks,
Paolo.

///////////////////
2011-12-02  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/std/iomanip (put_money): Fix thinko, use __err local,
	like in, eg, basic_ostream::_M_insert.

Patch

Index: include/std/iomanip
===================================================================
--- include/std/iomanip	(revision 181928)
+++ include/std/iomanip	(working copy)
@@ -282,7 +282,7 @@ 
 	    }
 	  __catch(...)
 	    { __is._M_setstate(ios_base::badbit); }
-	  if (ios_base::goodbit != __err)
+	  if (__err)
 	    __is.setstate(__err);
 	}
       return __is; 
@@ -312,15 +312,16 @@ 
       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 @@ 
 	    }
 	  __catch(...)
 	    { __os._M_setstate(ios_base::badbit); }
+	  if (__err)
+	    __os.setstate(__err);
 	}
       return __os; 
     }