mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
libstdc++: Make std::chrono::current_zone() default to UTC
This is consistent with the behaviour of glibc, which assumes UTC when /etc/localtime and TZ do not identify a valid time zone. The fallback tzdb used when no valid tzdata exists always contains the UTC zone, so this change means we have a valid tzdb and valid current zone even in the degenerate case. With this default we no longer need the AIX-specific kluge to try and identify TZ values specifying a 0-offset zone. We can just use the UTC default for those, as it has the same effect. It's still possible for chrono::current_zone() to fail, because the user could have provided a custom tzdata.zi file which doesn't contain the UTC time zone, so the "UTC" default would fail to find a valid zone, and throw an exception. That's just user error, they should not provide bad data and expect reasonable behaviour. libstdc++-v3/ChangeLog: * src/c++20/tzdb.cc (chrono::tzdb::current_zone()) Use "UTC" if current time zone cannot be determined. * testsuite/std/time/tzdb/1.cc: Remove conditions based on HAVE_TZDB macro and test all members unconditionally.
This commit is contained in:
parent
096f034a8f
commit
4abd5bc600
@ -1692,19 +1692,16 @@ namespace std::chrono
|
||||
// https://www.ibm.com/support/pages/managing-time-zone-variable-posix
|
||||
if (const char* env = std::getenv("TZ"))
|
||||
{
|
||||
string_view s(env);
|
||||
if (s == "GMT0")
|
||||
s = "Etc/GMT";
|
||||
else if (s.size() == 4 && s[3] == '0')
|
||||
s = "Etc/UTC";
|
||||
|
||||
// This will fail unless TZ contains an IANA time zone name,
|
||||
// or one of the special cases above.
|
||||
if (auto tz = do_locate_zone(this->zones, this->links, s))
|
||||
// This will fail unless TZ contains an IANA time zone name.
|
||||
if (auto tz = do_locate_zone(this->zones, this->links, env))
|
||||
return tz;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Default to UTC.
|
||||
if (auto tz = do_locate_zone(this->zones, this->links, "UTC"))
|
||||
return tz;
|
||||
|
||||
__throw_runtime_error("tzdb: cannot determine current zone");
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
// { dg-options "-std=gnu++20" }
|
||||
// { dg-do run { target c++20 } }
|
||||
// { dg-require-effective-target cxx11_abi }
|
||||
// { dg-additional-options "-DHAVE_TZDB" { target tzdb } }
|
||||
|
||||
#include <chrono>
|
||||
#include <testsuite_hooks.h>
|
||||
@ -14,22 +13,25 @@ test_version()
|
||||
const tzdb& db = get_tzdb();
|
||||
VERIFY( &db == &get_tzdb_list().front() );
|
||||
|
||||
#ifdef HAVE_TZDB
|
||||
VERIFY( db.version == remote_version() );
|
||||
const tzdb& reloaded = reload_tzdb();
|
||||
if (reloaded.version == db.version)
|
||||
VERIFY( &reloaded == &db );
|
||||
#endif
|
||||
const char* func;
|
||||
try {
|
||||
func = "remote_version";
|
||||
VERIFY( db.version == remote_version() );
|
||||
func = "reload_tzdb";
|
||||
const tzdb& reloaded = reload_tzdb();
|
||||
if (reloaded.version == db.version)
|
||||
VERIFY( &reloaded == &db );
|
||||
} catch (const std::exception&) {
|
||||
std::printf("std::chrono::%s() failed\n", func);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
test_current()
|
||||
{
|
||||
#ifdef HAVE_TZDB
|
||||
const tzdb& db = get_tzdb();
|
||||
const time_zone* tz = db.current_zone();
|
||||
VERIFY( tz == std::chrono::current_zone() );
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@ -43,9 +45,7 @@ test_locate()
|
||||
VERIFY( tz == db.locate_zone("Etc/GMT") );
|
||||
VERIFY( tz == db.locate_zone("Etc/GMT+0") );
|
||||
|
||||
#ifdef HAVE_TZDB
|
||||
VERIFY( db.locate_zone(db.current_zone()->name()) == db.current_zone() );
|
||||
#endif
|
||||
}
|
||||
|
||||
int main()
|
||||
|
Loading…
Reference in New Issue
Block a user