libstdc++: Support old and new T_FMT for en_HK locale [PR103687]
This checks whether the locale data for en_HK includes %p and adjusts the string being tested accordingly. To account for Jakub's fix to make %I parse "12" as 0 instead of 12, we need to change the expected value for the case where the locale format doesn't include %p. Also change the time from 12:00:00 to 12:02:01 so we can tell if the minutes and seconds get mixed up. libstdc++-v3/ChangeLog: PR libstdc++/103687 * testsuite/22_locale/time_get/get_date/wchar_t/4.cc: Restore original locale before returning. * testsuite/22_locale/time_get/get_time/char/2.cc: Check for %p in locale's T_FMT and adjust accordingly. * testsuite/22_locale/time_get/get_time/wchar_t/2.cc: Likewise.
This commit is contained in:
parent
85a438fc78
commit
9a4b4514bd
3 changed files with 65 additions and 10 deletions
|
@ -39,7 +39,7 @@ void test01()
|
|||
|
||||
wistringstream iss;
|
||||
iss.imbue(loc_tw);
|
||||
const time_get<wchar_t>& tim_get = use_facet<time_get<wchar_t> >(iss.getloc());
|
||||
const time_get<wchar_t>& tim_get = use_facet<time_get<wchar_t> >(iss.getloc());
|
||||
|
||||
const ios_base::iostate good = ios_base::goodbit;
|
||||
ios_base::iostate errorstate = good;
|
||||
|
@ -66,13 +66,14 @@ void test01()
|
|||
static bool debian_date_format()
|
||||
{
|
||||
#ifdef D_FMT
|
||||
std::string orig = setlocale(LC_TIME, NULL);
|
||||
if (setlocale(LC_TIME, "zh_TW.UTF-8") != NULL)
|
||||
{
|
||||
// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=31413
|
||||
// and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71641#c2
|
||||
if (*nl_langinfo(D_FMT) == '%')
|
||||
return true;
|
||||
setlocale(LC_TIME, "C");
|
||||
std::string d_fmt = nl_langinfo(D_FMT);
|
||||
setlocale(LC_TIME, orig.c_str());
|
||||
return d_fmt[0] == '%';
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
#include <sstream>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
static bool ampm_time_format();
|
||||
|
||||
void test02()
|
||||
{
|
||||
using namespace std;
|
||||
|
@ -36,19 +38,23 @@ void test02()
|
|||
locale loc_hk = locale(ISO_8859(1,en_HK));
|
||||
VERIFY( loc_hk != loc_c );
|
||||
|
||||
const int pm = ampm_time_format() ? 12 : 0;
|
||||
const string empty;
|
||||
const tm time_bday = __gnu_test::test_tm(0, 0, 12, 4, 3, 71, 0, 93, 0);
|
||||
const tm time_bday = __gnu_test::test_tm(1, 2, 0+pm, 4, 3, 71, 0, 93, 0);
|
||||
|
||||
// create an ostream-derived object, cache the time_get facet
|
||||
iterator_type end;
|
||||
istringstream iss;
|
||||
const time_get<char>& tim_get = use_facet<time_get<char> >(iss.getloc());
|
||||
const time_get<char>& tim_get = use_facet<time_get<char> >(iss.getloc());
|
||||
const ios_base::iostate good = ios_base::goodbit;
|
||||
ios_base::iostate errorstate = good;
|
||||
|
||||
// inspection of named locales, en_HK
|
||||
iss.imbue(loc_hk);
|
||||
iss.str("12:00:00 PM PST");
|
||||
if (pm)
|
||||
iss.str("12:02:01 PM PST");
|
||||
else
|
||||
iss.str("12:02:01 PST"); // %I means 12-hour clock, so parsed as 12am
|
||||
// Hong Kong in California! Well, they have Paris in Vegas... this
|
||||
// is all a little disney-esque anyway. Besides, you can get decent
|
||||
// Dim Sum in San Francisco.
|
||||
|
@ -62,6 +68,27 @@ void test02()
|
|||
VERIFY( errorstate == ios_base::eofbit );
|
||||
}
|
||||
|
||||
#include <locale.h>
|
||||
#if __has_include(<langinfo.h>)
|
||||
# include <langinfo.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
static bool ampm_time_format()
|
||||
{
|
||||
#ifdef T_FMT
|
||||
std::string orig = setlocale(LC_TIME, NULL);
|
||||
if (setlocale(LC_TIME, ISO_8859(1,en_HK)) != NULL)
|
||||
{
|
||||
// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103687
|
||||
std::string t_fmt = nl_langinfo(T_FMT);
|
||||
setlocale(LC_TIME, orig.c_str());
|
||||
return t_fmt.find("%p") != std::string::npos;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test02();
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
#include <sstream>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
static bool ampm_time_format();
|
||||
|
||||
void test02()
|
||||
{
|
||||
using namespace std;
|
||||
|
@ -36,19 +38,23 @@ void test02()
|
|||
locale loc_hk = locale(ISO_8859(1,en_HK));
|
||||
VERIFY( loc_hk != loc_c );
|
||||
|
||||
const int pm = ampm_time_format() ? 12 : 0;
|
||||
const wstring empty;
|
||||
const tm time_bday = __gnu_test::test_tm(0, 0, 12, 4, 3, 71, 0, 93, 0);
|
||||
const tm time_bday = __gnu_test::test_tm(1, 2, 0+pm, 4, 3, 71, 0, 93, 0);
|
||||
|
||||
// create an ostream-derived object, cache the time_get facet
|
||||
iterator_type end;
|
||||
wistringstream iss;
|
||||
const time_get<wchar_t>& tim_get = use_facet<time_get<wchar_t> >(iss.getloc());
|
||||
const time_get<wchar_t>& tim_get = use_facet<time_get<wchar_t> >(iss.getloc());
|
||||
const ios_base::iostate good = ios_base::goodbit;
|
||||
ios_base::iostate errorstate = good;
|
||||
|
||||
// inspection of named locales, en_HK
|
||||
iss.imbue(loc_hk);
|
||||
iss.str(L"12:00:00 PM PST");
|
||||
if (pm)
|
||||
iss.str(L"12:02:01 PM PST");
|
||||
else
|
||||
iss.str(L"12:02:01 PST"); // %I means 12-hour clock, so parsed as 12am
|
||||
// Hong Kong in California! Well, they have Paris in Vegas... this
|
||||
// is all a little disney-esque anyway. Besides, you can get decent
|
||||
// Dim Sum in San Francisco.
|
||||
|
@ -62,6 +68,27 @@ void test02()
|
|||
VERIFY( errorstate == ios_base::eofbit );
|
||||
}
|
||||
|
||||
#include <locale.h>
|
||||
#if __has_include(<langinfo.h>)
|
||||
# include <langinfo.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
static bool ampm_time_format()
|
||||
{
|
||||
#ifdef T_FMT
|
||||
std::string orig = setlocale(LC_TIME, NULL);
|
||||
if (setlocale(LC_TIME, ISO_8859(1,en_HK)) != NULL)
|
||||
{
|
||||
// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103687
|
||||
std::string t_fmt = nl_langinfo(T_FMT);
|
||||
setlocale(LC_TIME, orig.c_str());
|
||||
return t_fmt.find("%p") != std::string::npos;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test02();
|
||||
|
|
Loading…
Add table
Reference in a new issue