Commit 7ea6fdf5 by Paolo Carlini Committed by Paolo Carlini

PR libstdc++/37958 (cont again)

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
parent 6f6e26a8
2008-11-01 Paolo Carlini <paolo.carlini@oracle.com> 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&), * include/bits/locale_facets.tcc (num_get<>::do_get(, long&),
num_get<>::do_get(, unsigned short&), num_get<>::do_get(, unsigned short&),
num_get<>::do_get(, unsigned int&), num_get<>::do_get(, unsigned int&),
......
...@@ -606,11 +606,11 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE ...@@ -606,11 +606,11 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE
bool __testf = true; bool __testf = true;
bool __testt = true; bool __testt = true;
bool __donef = __lc->_M_falsename_size == 0;
bool __donet = __lc->_M_truename_size == 0;
bool __testeof = false; bool __testeof = false;
size_t __n; size_t __n = 0;
const size_t __lim = std::max(__lc->_M_falsename_size, while (!__donef || !__donet)
__lc->_M_truename_size);
for (__n = 0; __n < __lim; ++__n, ++__beg)
{ {
if (__beg == __end) if (__beg == __end)
{ {
...@@ -620,10 +620,10 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE ...@@ -620,10 +620,10 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE
const char_type __c = *__beg; const char_type __c = *__beg;
if (__testf && __n < __lc->_M_falsename_size) if (!__donef)
__testf = __c == __lc->_M_falsename[__n]; __testf = __c == __lc->_M_falsename[__n];
if (__testt && __n < __lc->_M_truename_size) if (!__donet)
__testt = __c == __lc->_M_truename[__n]; __testt = __c == __lc->_M_truename[__n];
if (!__testt && !__testf) if (!__testt && !__testf)
...@@ -632,6 +632,12 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE ...@@ -632,6 +632,12 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE
if ((!__testt && __n >= __lc->_M_falsename_size) if ((!__testt && __n >= __lc->_M_falsename_size)
|| (!__testf && __n >= __lc->_M_truename_size)) || (!__testf && __n >= __lc->_M_truename_size))
break; 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) if (__testf && __n == __lc->_M_falsename_size && __n)
{ {
......
...@@ -50,20 +50,36 @@ void test01() ...@@ -50,20 +50,36 @@ void test01()
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
istringstream iss1, iss2, iss3; istringstream iss0, iss1, iss2, iss3;
iss1.imbue(locale(iss1.getloc(), new Punct1)); iss1.imbue(locale(iss1.getloc(), new Punct1));
iss2.imbue(locale(iss2.getloc(), new Punct2)); iss2.imbue(locale(iss2.getloc(), new Punct2));
iss3.imbue(locale(iss3.getloc(), new Punct3)); 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>& ng1 = use_facet<num_get<char> >(iss1.getloc());
const num_get<char>& ng2 = use_facet<num_get<char> >(iss2.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()); const num_get<char>& ng3 = use_facet<num_get<char> >(iss3.getloc());
ios_base::iostate err = ios_base::goodbit; ios_base::iostate err = ios_base::goodbit;
iterator_type end; iterator_type end;
bool b0 = false;
bool b1 = false; bool b1 = false;
bool b2 = false; bool b2 = false;
bool b3 = true; 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.str("a");
iss1.setf(ios_base::boolalpha); iss1.setf(ios_base::boolalpha);
err = ios_base::goodbit; err = ios_base::goodbit;
...@@ -93,6 +109,13 @@ void test01() ...@@ -93,6 +109,13 @@ void test01()
VERIFY( err == ios_base::goodbit ); VERIFY( err == ios_base::goodbit );
VERIFY( b2 == true ); 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.str("blah");
iss3.setf(ios_base::boolalpha); iss3.setf(ios_base::boolalpha);
err = ios_base::goodbit; err = ios_base::goodbit;
...@@ -100,6 +123,14 @@ void test01() ...@@ -100,6 +123,14 @@ void test01()
VERIFY( err == ios_base::failbit ); VERIFY( err == ios_base::failbit );
VERIFY( b3 == false ); VERIFY( b3 == false );
VERIFY( *end == 'b' ); 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() int main()
......
...@@ -50,20 +50,36 @@ void test01() ...@@ -50,20 +50,36 @@ void test01()
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
wistringstream iss1, iss2, iss3; wistringstream iss0, iss1, iss2, iss3;
iss1.imbue(locale(iss1.getloc(), new Punct1)); iss1.imbue(locale(iss1.getloc(), new Punct1));
iss2.imbue(locale(iss2.getloc(), new Punct2)); iss2.imbue(locale(iss2.getloc(), new Punct2));
iss3.imbue(locale(iss3.getloc(), new Punct3)); 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>& 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>& ng2 = use_facet<num_get<wchar_t> >(iss2.getloc());
const num_get<wchar_t>& ng3 = use_facet<num_get<wchar_t> >(iss3.getloc()); const num_get<wchar_t>& ng3 = use_facet<num_get<wchar_t> >(iss3.getloc());
ios_base::iostate err = ios_base::goodbit; ios_base::iostate err = ios_base::goodbit;
iterator_type end; iterator_type end;
bool b0 = false;
bool b1 = false; bool b1 = false;
bool b2 = false; bool b2 = false;
bool b3 = true; 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.str(L"a");
iss1.setf(ios_base::boolalpha); iss1.setf(ios_base::boolalpha);
err = ios_base::goodbit; err = ios_base::goodbit;
...@@ -93,6 +109,13 @@ void test01() ...@@ -93,6 +109,13 @@ void test01()
VERIFY( err == ios_base::goodbit ); VERIFY( err == ios_base::goodbit );
VERIFY( b2 == true ); 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.str(L"blah");
iss3.setf(ios_base::boolalpha); iss3.setf(ios_base::boolalpha);
err = ios_base::goodbit; err = ios_base::goodbit;
...@@ -100,6 +123,14 @@ void test01() ...@@ -100,6 +123,14 @@ void test01()
VERIFY( err == ios_base::failbit ); VERIFY( err == ios_base::failbit );
VERIFY( b3 == false ); VERIFY( b3 == false );
VERIFY( *end == L'b' ); 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() int main()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment