]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/37958 (cont again)
authorPaolo Carlini <paolo.carlini@oracle.com>
Sat, 1 Nov 2008 22:09:43 +0000 (22:09 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sat, 1 Nov 2008 22:09:43 +0000 (22:09 +0000)
2008-11-01  Paolo Carlini  <paolo.carlini@oracle.com>

PR libstdc++/37958 (cont again)
* include/bits/locale_facets.tcc (num_get<>::do_get(iter_type,
iter_type, ios_base&, ios_base::iostate&, bool&): Fix again.
* testsuite/22_locale/num_get/get/char/37958.cc: Extend.
* testsuite/22_locale/num_get/get/wchar_t/37958.cc: Likewise.

From-SVN: r141523

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/locale_facets.tcc
libstdc++-v3/testsuite/22_locale/num_get/get/char/37958.cc
libstdc++-v3/testsuite/22_locale/num_get/get/wchar_t/37958.cc

index e3388df23b78e7ea1ac049b4a9fce09e2c481daf..18fd23283d3efde7a72f2cde82f0c0e7e9c31f02 100644 (file)
@@ -1,3 +1,11 @@
+2008-11-01  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR libstdc++/37958 (cont again)
+       * include/bits/locale_facets.tcc (num_get<>::do_get(iter_type,
+       iter_type, ios_base&, ios_base::iostate&, bool&): Fix again.
+       * testsuite/22_locale/num_get/get/char/37958.cc: Extend.
+       * testsuite/22_locale/num_get/get/wchar_t/37958.cc: Likewise.
+
 2008-11-01  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * include/bits/locale_facets.tcc (num_get<>::do_get(, long&),
index bee770bd03f92dd053e6b3b928507b9e23e2de7c..36a2d9b80c4a649cebd3246efd62e24aa7d43103 100644 (file)
@@ -606,11 +606,11 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE
 
          bool __testf = true;
          bool __testt = true;
+         bool __donef = __lc->_M_falsename_size == 0;
+         bool __donet = __lc->_M_truename_size == 0;
          bool __testeof = false;
-         size_t __n;
-         const size_t __lim = std::max(__lc->_M_falsename_size,
-                                       __lc->_M_truename_size);
-         for (__n = 0; __n < __lim; ++__n, ++__beg)
+         size_t __n = 0;
+         while (!__donef || !__donet)
            {
              if (__beg == __end)
                {
@@ -620,10 +620,10 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE
 
              const char_type __c = *__beg;
 
-             if (__testf && __n < __lc->_M_falsename_size)
+             if (!__donef)
                __testf = __c == __lc->_M_falsename[__n];
 
-             if (__testt && __n < __lc->_M_truename_size)
+             if (!__donet)
                __testt = __c == __lc->_M_truename[__n];
 
              if (!__testt && !__testf)
@@ -632,6 +632,12 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE
              if ((!__testt && __n >= __lc->_M_falsename_size)
                  || (!__testf && __n >= __lc->_M_truename_size))
                break;
+
+             ++__n;
+             ++__beg;
+
+             __donef = !__testf || __n >= __lc->_M_falsename_size;
+             __donet = !__testt || __n >= __lc->_M_truename_size;
            }
          if (__testf && __n == __lc->_M_falsename_size && __n)
            {
index 6e931705da61a98d63f8a3ef3d1f5de048e1cff9..9f7a43c4c1e98e75f9dd090efcd16eb317eed12f 100644 (file)
@@ -50,20 +50,36 @@ void test01()
   
   bool test __attribute__((unused)) = true;
 
-  istringstream iss1, iss2, iss3;
+  istringstream iss0, iss1, iss2, iss3;
   iss1.imbue(locale(iss1.getloc(), new Punct1));
   iss2.imbue(locale(iss2.getloc(), new Punct2));
   iss3.imbue(locale(iss3.getloc(), new Punct3));
+  const num_get<char>& ng0 = use_facet<num_get<char> >(iss0.getloc());
   const num_get<char>& ng1 = use_facet<num_get<char> >(iss1.getloc());
   const num_get<char>& ng2 = use_facet<num_get<char> >(iss2.getloc());
   const num_get<char>& ng3 = use_facet<num_get<char> >(iss3.getloc());
 
   ios_base::iostate err = ios_base::goodbit;
   iterator_type end;
+  bool b0 = false;
   bool b1 = false;
   bool b2 = false;
   bool b3 = true;
 
+  iss0.str("true");
+  iss0.setf(ios_base::boolalpha);
+  err = ios_base::goodbit;
+  end = ng0.get(iss0.rdbuf(), 0, iss0, err, b0);
+  VERIFY( err == ios_base::goodbit );
+  VERIFY( b0 == true );
+
+  iss0.str("false");
+  iss0.clear();
+  err = ios_base::goodbit;
+  end = ng0.get(iss0.rdbuf(), 0, iss0, err, b0);
+  VERIFY( err == ios_base::goodbit );
+  VERIFY( b0 == false );
+
   iss1.str("a");
   iss1.setf(ios_base::boolalpha);
   err = ios_base::goodbit;
@@ -93,6 +109,13 @@ void test01()
   VERIFY( err == ios_base::goodbit );
   VERIFY( b2 == true );
 
+  iss2.str("0");
+  iss2.clear();
+  err = ios_base::goodbit;
+  end = ng2.get(iss2.rdbuf(), 0, iss2, err, b2);
+  VERIFY( err == ios_base::goodbit );
+  VERIFY( b2 == false );
+
   iss3.str("blah");
   iss3.setf(ios_base::boolalpha);
   err = ios_base::goodbit;
@@ -100,6 +123,14 @@ void test01()
   VERIFY( err == ios_base::failbit );
   VERIFY( b3 == false );
   VERIFY( *end == 'b' );
+
+  iss3.str("");
+  iss3.clear();
+  b3 = true;
+  err = ios_base::goodbit;
+  end = ng3.get(iss3.rdbuf(), 0, iss3, err, b3);
+  VERIFY( err == ios_base::failbit );
+  VERIFY( b3 == false );
 }
 
 int main()
index a9ce6df01277a4ceed1832663bbe273833a48c33..b36573697a400c561f491dc8e03bc46f5714297a 100644 (file)
@@ -50,20 +50,36 @@ void test01()
   
   bool test __attribute__((unused)) = true;
 
-  wistringstream iss1, iss2, iss3;
+  wistringstream iss0, iss1, iss2, iss3;
   iss1.imbue(locale(iss1.getloc(), new Punct1));
   iss2.imbue(locale(iss2.getloc(), new Punct2));
   iss3.imbue(locale(iss3.getloc(), new Punct3));
+  const num_get<wchar_t>& ng0 = use_facet<num_get<wchar_t> >(iss0.getloc());
   const num_get<wchar_t>& ng1 = use_facet<num_get<wchar_t> >(iss1.getloc());
   const num_get<wchar_t>& ng2 = use_facet<num_get<wchar_t> >(iss2.getloc());
   const num_get<wchar_t>& ng3 = use_facet<num_get<wchar_t> >(iss3.getloc());
 
   ios_base::iostate err = ios_base::goodbit;
   iterator_type end;
+  bool b0 = false;
   bool b1 = false;
   bool b2 = false;
   bool b3 = true;
 
+  iss0.str(L"true");
+  iss0.setf(ios_base::boolalpha);
+  err = ios_base::goodbit;
+  end = ng0.get(iss0.rdbuf(), 0, iss0, err, b0);
+  VERIFY( err == ios_base::goodbit );
+  VERIFY( b0 == true );
+
+  iss0.str(L"false");
+  iss0.clear();
+  err = ios_base::goodbit;
+  end = ng0.get(iss0.rdbuf(), 0, iss0, err, b0);
+  VERIFY( err == ios_base::goodbit );
+  VERIFY( b0 == false );
+
   iss1.str(L"a");
   iss1.setf(ios_base::boolalpha);
   err = ios_base::goodbit;
@@ -93,6 +109,13 @@ void test01()
   VERIFY( err == ios_base::goodbit );
   VERIFY( b2 == true );
 
+  iss2.str(L"0");
+  iss2.clear();
+  err = ios_base::goodbit;
+  end = ng2.get(iss2.rdbuf(), 0, iss2, err, b2);
+  VERIFY( err == ios_base::goodbit );
+  VERIFY( b2 == false );
+
   iss3.str(L"blah");
   iss3.setf(ios_base::boolalpha);
   err = ios_base::goodbit;
@@ -100,6 +123,14 @@ void test01()
   VERIFY( err == ios_base::failbit );
   VERIFY( b3 == false );
   VERIFY( *end == L'b' );
+
+  iss3.str(L"");
+  iss3.clear();
+  b3 = true;
+  err = ios_base::goodbit;
+  end = ng3.get(iss3.rdbuf(), 0, iss3, err, b3);
+  VERIFY( err == ios_base::failbit );
+  VERIFY( b3 == false );
 }
 
 int main()