https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108409

            Bug ID: 108409
           Summary: std::chrono::current_zone() doesn't work on AIX
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---
            Target: *-*aix*

terminate called after throwing an instance of 'std::runtime_error'
  what():  tzdb: cannot determine current zone
FAIL: std/time/tzdb/1.cc execution test

terminate called after throwing an instance of 'std::runtime_error'
  what():  tzdb: cannot determine current zone
FAIL: std/time/zoned_time/custom.cc execution test


The std::chrono::current_zone() function is supposed to determine the machine's
time zone. As noted in libstdc++-v3/src/c++20/tzdb.cc:

    // TODO AIX stores current zone in $TZ in /etc/environment but the value
    // is typically a POSIX time zone name, not IANA zone.
    // https://developer.ibm.com/articles/au-aix-posix/
    // https://www.ibm.com/support/pages/managing-time-zone-variable-posix

    __throw_runtime_error("tzdb: cannot determine current zone");

How should we solve this?

We should parse the TZ env var and see if it is already an IANA name, and
handle a few other special cases. E.g. gcc119 in the cfarm hax TZ=CUT0 which
means a time zone named "CUT" (coordinated universal time) with a 0 offset from
UTC. So map to UTC. More generally, "FOOn" is a time zone called "FOO" with a
-n offset, so we could map any such string to "Etc/GMT-n"

We could add some AIX-specific extension point, so programs can tell the
library the IANA (aka Olson) name of the current time zone. Maybe read it from
another file, something configurable and controlled by the user/program. But if
we handle the TZ variable, users can just set that in their program's env and
another extension point probably isn't needed.

Reply via email to