This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] Fix a bug in money_get::do_get(string_type&)


Hi,

tested x86-linux.

Paolo.

////////////////
2004-02-16  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/locale_facets.tcc (money_get::do_get(string_type&)):
	Fix parsing of the remaining sign characters.
	* 22_locale/money_get/get/char/2.cc: Tweak: now, correctly,
	the input is scanned 'til eof.
	* 22_locale/money_get/get/char/4.cc: Likewise.
	* 22_locale/money_get/get/wchar_t/2.cc: Likewise.
	* 22_locale/money_get/get/wchar_t/4.cc: Likewise.
	* 22_locale/money_get/get/char/8.cc: Tweak: override do_neg_format,
	not do_pos_format: the former is the only one that matters during
	input.
	* 22_locale/money_get/get/wchar_t/8.cc: Likewise.

	* 22_locale/money_get/get/char/6.cc: Minor tweak.
	* 22_locale/money_get/get/wchar_t/6.cc: Likewise.
diff -urN libstdc++-v3-orig/include/bits/locale_facets.tcc libstdc++-v3/include/bits/locale_facets.tcc
--- libstdc++-v3-orig/include/bits/locale_facets.tcc	2004-02-15 17:54:47.000000000 +0100
+++ libstdc++-v3/include/bits/locale_facets.tcc	2004-02-15 20:01:15.000000000 +0100
@@ -1207,7 +1207,7 @@
 		  || ((static_cast<part>(__p.field[3]) != money_base::none)
 		      && __i == 2))
 		{
-		  // According to 22.2.6.1.2.2, symbol is required
+		  // According to 22.2.6.1.2, p2, symbol is required
 		  // if (__io.flags() & ios_base::showbase),
 		  // otherwise is optional and consumed only if
 		  // other characters are needed to complete the
@@ -1293,9 +1293,8 @@
 	{
 	  const size_type __len = __sign.size();
 	  size_type __i = 1;
-	  for (; __beg != __end && __i < __len; ++__i)
-	    for (; __beg != __end
-		   && *__beg != __sign[__i]; ++__beg);
+	  for (; __beg != __end && __i < __len
+		 && *__beg == __sign[__i]; ++__beg, ++__i);
 
 	  if (__i != __len)
 	    __testvalid = false;
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_get/get/char/2.cc libstdc++-v3/testsuite/22_locale/money_get/get/char/2.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_get/get/char/2.cc	2004-02-05 21:13:37.000000000 +0100
+++ libstdc++-v3/testsuite/22_locale/money_get/get/char/2.cc	2004-02-15 20:09:31.000000000 +0100
@@ -81,7 +81,7 @@
   ios_base::iostate err10 = ios_base::goodbit;
   mon_get.get(is_it10, end, true, iss, err10, result10);
   VERIFY( result10 == digits2 );
-  VERIFY( err10 == ios_base::goodbit );
+  VERIFY( err10 == ios_base::eofbit );
 
   iss.str("(HKD .01)"); 
   iterator_type is_it11(iss);
@@ -89,7 +89,7 @@
   ios_base::iostate err11 = ios_base::goodbit;
   mon_get.get(is_it11, end, true, iss, err11, result11);
   VERIFY( result11 == digits4 );
-  VERIFY( err11 == ios_base::goodbit );
+  VERIFY( err11 == ios_base::eofbit );
 
   // for the "en_HK" locale the parsing of the very same input streams must
   // be successful without showbase too, since the symbol field appears in
@@ -111,7 +111,7 @@
   ios_base::iostate err13 = ios_base::goodbit;
   mon_get.get(is_it13, end, true, iss, err13, result13);
   VERIFY( result13 == digits2 );
-  VERIFY( err13 == ios_base::goodbit );
+  VERIFY( err13 == ios_base::eofbit );
 
   iss.str("(HKD .01)"); 
   iterator_type is_it14(iss);
@@ -119,7 +119,7 @@
   ios_base::iostate err14 = ios_base::goodbit;
   mon_get.get(is_it14, end, true, iss, err14, result14);
   VERIFY( result14 == digits4 );
-  VERIFY( err14 == ios_base::goodbit );
+  VERIFY( err14 == ios_base::eofbit );
 }
 
 int main()
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_get/get/char/4.cc libstdc++-v3/testsuite/22_locale/money_get/get/char/4.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_get/get/char/4.cc	2004-02-05 21:13:37.000000000 +0100
+++ libstdc++-v3/testsuite/22_locale/money_get/get/char/4.cc	2004-02-15 20:20:32.000000000 +0100
@@ -28,8 +28,6 @@
 void test04()
 {
   using namespace std;
-  typedef money_base::part part;
-  typedef money_base::pattern pattern;
   typedef istreambuf_iterator<char> iterator_type;
 
   bool test __attribute__((unused)) = true;
@@ -64,7 +62,7 @@
   ios_base::iostate err03 = ios_base::goodbit;
   mon_get.get(is_it03, end, true, iss, err03, result3);
   VERIFY( result3 == digits4 );
-  VERIFY( err03 == ios_base::goodbit );
+  VERIFY( err03 == ios_base::eofbit );
 }
 
 int main()
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_get/get/char/6.cc libstdc++-v3/testsuite/22_locale/money_get/get/char/6.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_get/get/char/6.cc	2003-09-23 22:02:27.000000000 +0200
+++ libstdc++-v3/testsuite/22_locale/money_get/get/char/6.cc	2004-02-15 21:02:02.000000000 +0100
@@ -1,6 +1,6 @@
 // 2001-09-12 Benjamin Kosnik  <bkoz@redhat.com>
 
-// Copyright (C) 2001, 2002, 2003 Free Software Foundation
+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -35,12 +35,6 @@
   
   int do_frac_digits() const { return 2; }
 
-  pattern do_pos_format() const
-  {
-    pattern pat = { { symbol, none, sign, value } };
-    return pat;
-  }
-
   pattern do_neg_format() const
   {
     pattern pat = { { symbol, none, sign, value } };
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_get/get/char/8.cc libstdc++-v3/testsuite/22_locale/money_get/get/char/8.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_get/get/char/8.cc	2003-09-23 22:02:27.000000000 +0200
+++ libstdc++-v3/testsuite/22_locale/money_get/get/char/8.cc	2004-02-15 20:59:01.000000000 +0100
@@ -34,7 +34,7 @@
   
   int do_frac_digits() const { return 2; }
 
-  pattern do_pos_format() const
+  pattern do_neg_format() const
   {
     pattern pat = { { sign, value, space, symbol } };
     return pat;
@@ -51,7 +51,7 @@
   
   int do_frac_digits() const { return 2; }
 
-  pattern do_pos_format() const
+  pattern do_neg_format() const
   {
     pattern pat = { { sign, value, symbol, none } };
     return pat;
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_get/get/wchar_t/2.cc libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/2.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_get/get/wchar_t/2.cc	2004-02-05 21:13:37.000000000 +0100
+++ libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/2.cc	2004-02-15 20:10:05.000000000 +0100
@@ -81,7 +81,7 @@
   ios_base::iostate err10 = ios_base::goodbit;
   mon_get.get(is_it10, end, true, iss, err10, result10);
   VERIFY( result10 == digits2 );
-  VERIFY( err10 == ios_base::goodbit );
+  VERIFY( err10 == ios_base::eofbit );
 
   iss.str(L"(HKD .01)"); 
   iterator_type is_it11(iss);
@@ -89,7 +89,7 @@
   ios_base::iostate err11 = ios_base::goodbit;
   mon_get.get(is_it11, end, true, iss, err11, result11);
   VERIFY( result11 == digits4 );
-  VERIFY( err11 == ios_base::goodbit );
+  VERIFY( err11 == ios_base::eofbit );
 
   // for the "en_HK" locale the parsing of the very same input streams must
   // be successful without showbase too, since the symbol field appears in
@@ -111,7 +111,7 @@
   ios_base::iostate err13 = ios_base::goodbit;
   mon_get.get(is_it13, end, true, iss, err13, result13);
   VERIFY( result13 == digits2 );
-  VERIFY( err13 == ios_base::goodbit );
+  VERIFY( err13 == ios_base::eofbit );
 
   iss.str(L"(HKD .01)"); 
   iterator_type is_it14(iss);
@@ -119,7 +119,7 @@
   ios_base::iostate err14 = ios_base::goodbit;
   mon_get.get(is_it14, end, true, iss, err14, result14);
   VERIFY( result14 == digits4 );
-  VERIFY( err14 == ios_base::goodbit );
+  VERIFY( err14 == ios_base::eofbit );
 }
 
 int main()
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_get/get/wchar_t/4.cc libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/4.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_get/get/wchar_t/4.cc	2004-02-05 21:13:37.000000000 +0100
+++ libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/4.cc	2004-02-15 20:15:52.000000000 +0100
@@ -28,8 +28,6 @@
 void test04()
 {
   using namespace std;
-  typedef money_base::part part;
-  typedef money_base::pattern pattern;
   typedef istreambuf_iterator<wchar_t> iterator_type;
 
   bool test __attribute__((unused)) = true;
@@ -64,7 +62,7 @@
   ios_base::iostate err03 = ios_base::goodbit;
   mon_get.get(is_it03, end, true, iss, err03, result3);
   VERIFY( result3 == digits4 );
-  VERIFY( err03 == ios_base::goodbit );
+  VERIFY( err03 == ios_base::eofbit );
 }
 
 int main()
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_get/get/wchar_t/6.cc libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/6.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_get/get/wchar_t/6.cc	2003-09-23 22:02:28.000000000 +0200
+++ libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/6.cc	2004-02-15 21:02:16.000000000 +0100
@@ -1,6 +1,6 @@
 // 2001-09-12 Benjamin Kosnik  <bkoz@redhat.com>
 
-// Copyright (C) 2001, 2002, 2003 Free Software Foundation
+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -35,12 +35,6 @@
   
   int do_frac_digits() const { return 2; }
 
-  pattern do_pos_format() const
-  {
-    pattern pat = { { symbol, none, sign, value } };
-    return pat;
-  }
-
   pattern do_neg_format() const
   {
     pattern pat = { { symbol, none, sign, value } };
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_get/get/wchar_t/8.cc libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/8.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_get/get/wchar_t/8.cc	2003-09-23 22:02:28.000000000 +0200
+++ libstdc++-v3/testsuite/22_locale/money_get/get/wchar_t/8.cc	2004-02-15 20:59:24.000000000 +0100
@@ -34,7 +34,7 @@
   
   int do_frac_digits() const { return 2; }
 
-  pattern do_pos_format() const
+  pattern do_neg_format() const
   {
     pattern pat = { { sign, value, space, symbol } };
     return pat;
@@ -51,7 +51,7 @@
   
   int do_frac_digits() const { return 2; }
 
-  pattern do_pos_format() const
+  pattern do_neg_format() const
   {
     pattern pat = { { sign, value, symbol, none } };
     return pat;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]