2002-03-05 Paolo Carlini <pcarlini@unitus.it>
authorPaolo Carlini <pcarlini@unitus.it>
Tue, 5 Mar 2002 12:09:45 +0000 (13:09 +0100)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 5 Mar 2002 12:09:45 +0000 (12:09 +0000)
libstdc++/5816
* include/bits/locale_facets.tcc
(num_get::_M_extract_float): Fix the parsing of __dec, since
the standard prescribes that if no grouping characters are
seen, no grouping check is applied.
        * testsuite/22_locale/num_get_members_char.cc: Add test05
distilled from the PR.
        * testsuite/22_locale/num_get_members_wchar_t.cc: Ditto.

From-SVN: r50317

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/locale_facets.tcc
libstdc++-v3/testsuite/22_locale/num_get_members_char.cc
libstdc++-v3/testsuite/22_locale/num_get_members_wchar_t.cc

index aff975de1fc0793852c435c07d5f8cfcd968d1ad..fe2cca8526c97de0849d7e88746bc0b3b581e231 100644 (file)
@@ -1,3 +1,14 @@
+2002-03-05  Paolo Carlini  <pcarlini@unitus.it>
+
+       libstdc++/5816
+       * include/bits/locale_facets.tcc
+       (num_get::_M_extract_float): Fix the parsing of __dec, since
+       the standard prescribes that if no grouping characters are
+       seen, no grouping check is applied.
+       * testsuite/22_locale/num_get_members_char.cc: Add test05
+       distilled from the PR.
+       * testsuite/22_locale/num_get_members_wchar_t.cc: Ditto.
+
 2002-03-04  Craig Rodrigues  <rodrigc@gcc.gnu.org>
 
        * docs/html/17_intro/porting-howto.xml: Refer to 
index 4f31bd6e0c97efb2ad123a3aa1996aa2592d51a0..edee81472e38b6d2bbdec6adcb8a2adc87cc9ce8 100644 (file)
@@ -174,7 +174,11 @@ namespace std
             }
          else if (__c == __dec && !__found_dec)
            {
-             __found_grouping += static_cast<char>(__sep_pos);
+             // According to the standard, if no grouping chars are seen,
+             // no grouping check is applied. Therefore __found_grouping
+             // must be adjusted only if __dec comes after some __sep.
+             if (__found_grouping.size())
+               __found_grouping += static_cast<char>(__sep_pos);
              ++__pos;
              __xtrc += '.';
              __c = *(++__beg);
index e8f2219543c88bd1cdfedf921f9bd0fed48d7477..5630351e2d538c7bf7fbf30c87eb96d785ab4bc5 100644 (file)
@@ -343,7 +343,7 @@ void test04()
 
   istringstream iss;
 
-  // A locale that expects grouping
+  // A locale that expects grouping  
   locale loc_de("de_DE");
   iss.imbue(loc_de);
 
@@ -390,12 +390,35 @@ void test04()
   VERIFY( ul == 0776 );
 }
 
+// libstdc++/5816
+void test05()
+{
+  using namespace std;
+  double d = 0.0;
+
+  istringstream iss;
+  locale loc_de("de_DE");
+  iss.imbue(loc_de);
+
+  const num_get<char>& ng = use_facet<num_get<char> >(iss.getloc()); 
+  const ios_base::iostate goodbit = ios_base::goodbit;
+  ios_base::iostate err = ios_base::goodbit;
+
+  iss.str("1234,5 ");
+  err = goodbit;
+  ng.get(iss.rdbuf(), 0, iss, err, d);
+  VERIFY( err == goodbit );
+  VERIFY( d == 1234.5 );
+}
+
 int main()
 {
   test01();
   test02();
   test03();
   test04();
+  test05();
   return 0;
 }
 
index 807fb5b14749a02e083757e3d7451444589b6008..c4927e18fb714161a6ba6d4ec235176ddc6782dc 100644 (file)
@@ -391,6 +391,28 @@ void test04()
   VERIFY( err == goodbit );
   VERIFY( ul == 0776 );
 }
+
+// libstdc++/5816
+void test05()
+{
+  using namespace std;
+  double d = 0.0;
+
+  wistringstream iss;
+  locale loc_de("de_DE");
+  iss.imbue(loc_de);
+
+  const num_get<wchar_t>& ng = use_facet<num_get<wchar_t> >(iss.getloc()); 
+  const ios_base::iostate goodbit = ios_base::goodbit;
+  ios_base::iostate err = ios_base::goodbit;
+
+  iss.str(L"1234,5 ");
+  err = goodbit;
+  ng.get(iss.rdbuf(), 0, iss, err, d);
+  VERIFY( err == goodbit );
+  VERIFY( d == 1234.5 );
+}
 #endif
 
 int main()
@@ -400,6 +422,7 @@ int main()
   test02();
   test03();
   test04();
+  test05();
 #endif
   return 0;
 }