<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/105634>105634</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [libc++] tzdb throws if `/etc/localtime` is not a symlink
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mgorny
      </td>
    </tr>
</table>

<pre>
    When `/etc/localtime` is a file rather than a symlink, tzdb throws. This can be seen e.g. in the following libc++ tests:

<details>

```
FAIL: llvm-libc++-shared.cfg.in :: std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp (8284 of 9740)
******************** TEST 'llvm-libc++-shared.cfg.in :: std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp' FAILED ********************
Exit Code: 250

Command Output (stdout):
--
# COMPILED WITH
/usr/lib/ccache/bin/i686-pc-linux-gnu-clang++ /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp -pthread --target=i686-pc-linux-gnu -nostdinc++ -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/include/c++/v1 -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/include/c++/v1 -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/test/support -std=c++26 -Werror -Wall -Wctad-maybe-unsupported -Wextra -Wshadow -Wundef -Wunused-template -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-noexcept-type -Wno-atomic-alignment -Wno-reserved-module-identifier -Wdeprecated-copy -Wdeprecated-copy-dtor -Wno-user-defined-literals -Wno-tautological-compare -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -Wno-local-type-template-args -Wno-c++11-extensions -Wno-unknown-pragmas -Wno-pass-failed -Wno-mismatched-new-delete -Wno-redundant-move -Wno-self-move -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER -D_LIBCPP_ENABLE_EXPERIMENTAL -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE -Werror=thread-safety -Wuser-defined-warnings  -lc++experimental -nostdlib++ -L /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/lib -Wl,-rpath,/var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/lib -lc++ -latomic -o /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.access/Output/current_zone.pass.cpp.dir/t.tmp.exe
# executed command: /usr/lib/ccache/bin/i686-pc-linux-gnu-clang++ /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp -pthread --target=i686-pc-linux-gnu -nostdinc++ -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/include/c++/v1 -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/include/c++/v1 -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/test/support -std=c++26 -Werror -Wall -Wctad-maybe-unsupported -Wextra -Wshadow -Wundef -Wunused-template -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-noexcept-type -Wno-atomic-alignment -Wno-reserved-module-identifier -Wdeprecated-copy -Wdeprecated-copy-dtor -Wno-user-defined-literals -Wno-tautological-compare -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -Wno-local-type-template-args -Wno-c++11-extensions -Wno-unknown-pragmas -Wno-pass-failed -Wno-mismatched-new-delete -Wno-redundant-move -Wno-self-move -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER -D_LIBCPP_ENABLE_EXPERIMENTAL -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE -Werror=thread-safety -Wuser-defined-warnings -lc++experimental -nostdlib++ -L /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/lib -Wl,-rpath,/var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/lib -lc++ -latomic -o /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.access/Output/current_zone.pass.cpp.dir/t.tmp.exe
# EXECUTED AS
/usr/bin/python3.12 /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/utils/run.py --execdir /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.access/Output/current_zone.pass.cpp.dir -- /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.access/Output/current_zone.pass.cpp.dir/t.tmp.exe
# executed command: /usr/bin/python3.12 /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/utils/run.py --execdir /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.access/Output/current_zone.pass.cpp.dir -- /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.access/Output/current_zone.pass.cpp.dir/t.tmp.exe
# .---command stderr------------
# | libc++abi: terminating due to uncaught exception of type std::runtime_error: tzdb: the path '/etc/localtime' is not a symlink
# `-----------------------------
# error: command failed with exit status: 250

--

********************
FAIL: llvm-libc++-shared.cfg.in :: std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp (8298 of 9740)
******************** TEST 'llvm-libc++-shared.cfg.in :: std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp' FAILED ********************
Exit Code: 250

Command Output (stdout):
--
# COMPILED WITH
/usr/lib/ccache/bin/i686-pc-linux-gnu-clang++ /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp -pthread --target=i686-pc-linux-gnu -nostdinc++ -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/include/c++/v1 -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/include/c++/v1 -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/test/support -std=c++26 -Werror -Wall -Wctad-maybe-unsupported -Wextra -Wshadow -Wundef -Wunused-template -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-noexcept-type -Wno-atomic-alignment -Wno-reserved-module-identifier -Wdeprecated-copy -Wdeprecated-copy-dtor -Wno-user-defined-literals -Wno-tautological-compare -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -Wno-local-type-template-args -Wno-c++11-extensions -Wno-unknown-pragmas -Wno-pass-failed -Wno-mismatched-new-delete -Wno-redundant-move -Wno-self-move -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER -D_LIBCPP_ENABLE_EXPERIMENTAL -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE -Werror=thread-safety -Wuser-defined-warnings  -lc++experimental -nostdlib++ -L /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/lib -Wl,-rpath,/var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/lib -lc++ -latomic -o /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/Output/current_zone.pass.cpp.dir/t.tmp.exe
# executed command: /usr/lib/ccache/bin/i686-pc-linux-gnu-clang++ /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp -pthread --target=i686-pc-linux-gnu -nostdinc++ -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/include/c++/v1 -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/include/c++/v1 -I /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/test/support -std=c++26 -Werror -Wall -Wctad-maybe-unsupported -Wextra -Wshadow -Wundef -Wunused-template -Wno-unused-command-line-argument -Wno-attributes -Wno-pessimizing-move -Wno-noexcept-type -Wno-atomic-alignment -Wno-reserved-module-identifier -Wdeprecated-copy -Wdeprecated-copy-dtor -Wno-user-defined-literals -Wno-tautological-compare -Wsign-compare -Wunused-variable -Wunused-parameter -Wunreachable-code -Wno-unused-local-typedef -Wno-local-type-template-args -Wno-c++11-extensions -Wno-unknown-pragmas -Wno-pass-failed -Wno-mismatched-new-delete -Wno-redundant-move -Wno-self-move -D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER -D_LIBCPP_ENABLE_EXPERIMENTAL -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE -Werror=thread-safety -Wuser-defined-warnings -lc++experimental -nostdlib++ -L /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/lib -Wl,-rpath,/var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/lib -lc++ -latomic -o /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/Output/current_zone.pass.cpp.dir/t.tmp.exe
# EXECUTED AS
/usr/bin/python3.12 /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/utils/run.py --execdir /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/Output/current_zone.pass.cpp.dir -- /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/Output/current_zone.pass.cpp.dir/t.tmp.exe
# executed command: /usr/bin/python3.12 /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/libcxx/utils/run.py --execdir /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/Output/current_zone.pass.cpp.dir -- /var/tmp/portage/sys-libs/libcxx-20.0.0_pre20240822/work/runtimes_build-abi_x86_32.x86/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/Output/current_zone.pass.cpp.dir/t.tmp.exe
# .---command stderr------------
# | libc++abi: terminating due to uncaught exception of type std::runtime_error: tzdb: the path '/etc/localtime' is not a symlink
# `-----------------------------
# error: command failed with exit status: 250

--

********************
```
</details>

While systemd requires `/etc/localtime` to be a symlink, there's no such requirement for non-systemd systems, and at least fresh non-systemd Gentoo installs still default to that (I'm going to work on changing that but the point remains that non-symlink `/etc/localtime` is still a valid scenario supported by glibc).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW91u2zoSfhrlZkBBphzHvvCF6582QJsWTRY-e2VQ4ljiliK15Cix-_QLSnLj9CfAntOTgxYyjCiiyOHMx-F85FgU3qvCIM6jy1fR5epCNFRaN68K68zxIrPyON-WaCCaJBHfIOUR32ibC02qwmiSgPIgYK80ghNUogMqhQEB_lhpZT5FfAn0WWZApbMPPoa7UnnIhYEMwSMawLiIQRmgEmFvtbYPyhSgVZZH_FXEXwGhJx-liyhZRcnpb7qUSEJpH6XrJw8mSf9tbzeL67dRugCt7yv2KJP5UjiUcb4vYmUgCE8X4ElGfNMa1l3iz9Y8-T-W2Ve3schz9D7im7xxDg3t2ge18D7O6xoiPp3y6RjsHmZX4yTis15P_ue_cLe-vYOIX_1TVkX8CgKy6xX8FTs6JNYHRbC0EoOy_DI5H82lrSphJLxvqG4ogOlJ2oYCjCeHYOyEaArL9-8-tGptr-_enIo3jXfBa1WwMs9FXgbrM2UivlGT6YTVOdPKNAdWmIblWpii97yIb-5FaEtVHfFNbR2JIjT2Rx9w953Y_HBgPImTONnVDnnCx8mU84hvHqz79KVKEIOeQuu_wc9YTaVDIYExEq5AitLVN8YBM9aTVOY0tdj1z7LRNSao63dZo7RkIlO7w3SyS3l8mE4C0CbXjQxy-75Dv6PfSYFvRrmpgyhgYbjTVd8rnwDbonPWAdsKrYFtcxKSVeKYIWtM3wplqHYgJ4BtfSmkfQC2bYzEfXttPEpGWNVaEALbGsv6wrybMmHQkQlXNBUa6moIIqeyhtB39zV6ryr1WZmCVfa-l2MsHnKsidGxxlNDW6mcCa0K8yjOoUd3j5JVVjYamZJoSO0VBtMk1g5zQa1G9fHbEiapxSBo7tExiXtlMOhN6ITuVSTRkNW2ULnQwbRauKBT4Kyz2970e-GUyPRZSS2cqJBajRrjUORlqMByK5-i1lJaa3GHsLFnRV-ADnj2ivXDORoxPBAar6zxJ4mfjH0wrHaiqMQJauE92wul24E1llXKV4LyEiUz-MAkajwNpEPZGCkMnQ2KR73vb1e7t9evlh8-7N4sbnc373cfPi5ev1vsbv99e7d-t3uzXqzWH89qrW8Wr96ud-s_Pqw_Xr9b39wt3j6R8XG1vrm-eb179361jtIfPNjdvL9Znxw3SlddrGFe7JHC2D4ZwQfhjDKFB2C6hwkPNToVXEfoPgi14bgLQm9fKgZolQHb6ogvmasFlRFfvmTP-kvY1d2MAmZfyvSfQj0dDf-Ig2KpWjtiquoYD_hIy3jAvAkxrQ9OgekHXh54eeDlgZcHXn5xXh5oeaDlQMvrP9bLf92tV7C4_Wqv3JFwfaTSmjQe8Z8eixtS2nf4xCEKsbBEkMr9ZrgDY7-ZRX9igTc40-BM_48zxYydVkvgSaJz7OzzWC-6Wp6liUWmgtcRukoZQcoUIBsEstCYXDRFSdCtn5Q1YPfQrqLaJeAiShc9ILueSBdtzrq9lgiBkyDiV99JgPMrUB6MpbOM96OCk4Q99zmbP6duT3b3S5IHRSXgQRF4EtT476RIv4j5y2nll8qYt9A-my-fTX-1fPlzNg3Z8pfflT_rY8Oe_J9WYNiTD3vyYU8-5Mp_v015TzxDpnzg5F9MgYGTB04eOHnIkw-UPGTJXxL1XySt-Xcu7AZHGhxpyI7_Ctnxr14vj9LAwN9_E31bKo3gj56wkuDwv41y6H_8Ij1ZyPCrF-dLdAHFgCH4Ji9PYtpF7N46MNawUxfd1YeGASRBoFF4gr1DXz6p-RoNWQvKeBJae_CktAaJe9FoCopQKdr88XXEryoobPAXshBmB1gDeSlM0ZaFellDnSNYZQgcVkIZ3z3qOm3tefYEQaeAgHuhlQSfoxFOBZNPm4nsCEXnzbP4Qs5TOUtn4gLnoys-TkfTGR9dlPMpz_joknPMxvnlVOwxya4kT_eXIz5JsxleqPlpqiczPh2P4uk4SZO9HIkRn40mchSNk6C-jrW-r2LrigvlfYPzUXI5SccXWmSofXtUgvPHyRVxHl2uLty8_X0hawofjROtPPlHOaRIt4cszppdrs6PRoDaP4vRk2l00Tg9L4nq9mAE30R8UygqmyzObRUa6_vThdXO_gfzEGpaY0II7O25n_P_BQAA__9kIDVW">