From: Jonathan Wakely <jwakely@redhat.com>
To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: [committed] libstdc++: Support old and new T_FMT for en_HK locale [PR103687]
Date: Tue, 14 Dec 2021 23:37:59 +0000 [thread overview]
Message-ID: <20211214233759.2177884-1-jwakely@redhat.com> (raw)
Tested x86_64-linux (glibc 2.33) and powerpc64le-linux (glibc 2.17).
Pushed to trunk.
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.
---
.../22_locale/time_get/get_date/wchar_t/4.cc | 9 ++---
.../22_locale/time_get/get_time/char/2.cc | 33 +++++++++++++++++--
.../22_locale/time_get/get_time/wchar_t/2.cc | 33 +++++++++++++++++--
3 files changed, 65 insertions(+), 10 deletions(-)
diff --git a/libstdc++-v3/testsuite/22_locale/time_get/get_date/wchar_t/4.cc b/libstdc++-v3/testsuite/22_locale/time_get/get_date/wchar_t/4.cc
index d227d4b1ce0..f6de882e4bd 100644
--- a/libstdc++-v3/testsuite/22_locale/time_get/get_date/wchar_t/4.cc
+++ b/libstdc++-v3/testsuite/22_locale/time_get/get_date/wchar_t/4.cc
@@ -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;
diff --git a/libstdc++-v3/testsuite/22_locale/time_get/get_time/char/2.cc b/libstdc++-v3/testsuite/22_locale/time_get/get_time/char/2.cc
index a847748dc27..b40971a9bf7 100644
--- a/libstdc++-v3/testsuite/22_locale/time_get/get_time/char/2.cc
+++ b/libstdc++-v3/testsuite/22_locale/time_get/get_time/char/2.cc
@@ -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();
diff --git a/libstdc++-v3/testsuite/22_locale/time_get/get_time/wchar_t/2.cc b/libstdc++-v3/testsuite/22_locale/time_get/get_time/wchar_t/2.cc
index b5d61e1afdb..b74604ef472 100644
--- a/libstdc++-v3/testsuite/22_locale/time_get/get_time/wchar_t/2.cc
+++ b/libstdc++-v3/testsuite/22_locale/time_get/get_time/wchar_t/2.cc
@@ -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();
--
2.31.1
reply other threads:[~2021-12-14 23:38 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211214233759.2177884-1-jwakely@redhat.com \
--to=jwakely@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=libstdc++@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).