https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71367
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |redi at gcc dot gnu.org Target Milestone|--- |10.0 Severity|minor |normal --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- We need this to fix some failing tests now, because glibc 2.29 changed T_FMT for some locales, including en_HK which we use in: testsuite/22_locale/time_get/get_time/char/2.cc testsuite/22_locale/time_get/get_time/wchar_t/2.cc They fail because the %X format is now "%I:%M:%S %p %Z". This patch allows %p to match "AM" or "PM", but locales are allowed to define their own strings instead of those: diff --git a/libstdc++-v3/include/bits/locale_facets_nonio.h b/libstdc++-v3/include/bits/locale_facets_nonio.h index 8247cfd0bc9..ef395d990e3 100644 --- a/libstdc++-v3/include/bits/locale_facets_nonio.h +++ b/libstdc++-v3/include/bits/locale_facets_nonio.h @@ -60,6 +60,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { // List of all known timezones, with GMT first. static const _CharT* _S_timezones[14]; + static const _CharT* _S_ampm[2]; const _CharT* _M_date_format; const _CharT* _M_date_era_format; diff --git a/libstdc++-v3/include/bits/locale_facets_nonio.tcc b/libstdc++-v3/include/bits/locale_facets_nonio.tcc index 9c80e5d751b..2fe0bb91f93 100644 --- a/libstdc++-v3/include/bits/locale_facets_nonio.tcc +++ b/libstdc++-v3/include/bits/locale_facets_nonio.tcc @@ -760,6 +760,18 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 else __tmperr |= ios_base::failbit; break; + case 'p': + { + int __tmp; + __beg = _M_extract_name(__beg, __end, __tmp, + __timepunct_cache<_CharT>::_S_ampm, 2, + __io, __tmperr); + if (__tmp == 0 && __tm->tm_hour == 12) + __tm->tm_hour = 0; // "12:34:56 AM" is "00:34:56s" + if (__tmp == 1 && __tm->tm_hour < 12) + __tm->tm_hour += 12; // "11:22:33 PM" is "23:22:33" + } + break; case 'R': // Equivalent to (%H:%M). __cs = "%H:%M"; diff --git a/libstdc++-v3/src/c++98/locale_facets.cc b/libstdc++-v3/src/c++98/locale_facets.cc index 051396a1468..0b769e9bb0c 100644 --- a/libstdc++-v3/src/c++98/locale_facets.cc +++ b/libstdc++-v3/src/c++98/locale_facets.cc @@ -36,6 +36,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION "IST", "EET", "CST", "JST" }; + template<> + const char* + __timepunct_cache<char>::_S_ampm[2] = { "AM", "PM" }; + #ifdef _GLIBCXX_USE_WCHAR_T template<> const wchar_t* @@ -44,6 +48,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION L"GMT", L"HST", L"AKST", L"PST", L"MST", L"CST", L"EST", L"AST", L"NST", L"CET", L"IST", L"EET", L"CST", L"JST" }; + + template<> + const wchar_t* + __timepunct_cache<wchar_t>::_S_ampm[2] = { L"AM", L"PM" }; #endif // Definitions for static const data members of money_base. The patch is also incomplete because the new static variables get exported with the wrong symbol version.