[libcxx-commits] [libcxx] [libc++] Fix C++23 standard modules when using with `clang-cl` on Windows (PR #148992)
via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Jul 21 23:06:26 PDT 2025
================
@@ -14,15 +14,57 @@ export {
using ::timespec _LIBCPP_USING_IF_EXISTS;
using ::tm _LIBCPP_USING_IF_EXISTS;
-
using ::asctime _LIBCPP_USING_IF_EXISTS;
using ::clock _LIBCPP_USING_IF_EXISTS;
+ using ::strftime _LIBCPP_USING_IF_EXISTS;
+
+#ifndef _LIBCPP_ABI_VCRUNTIME
using ::ctime _LIBCPP_USING_IF_EXISTS;
using ::difftime _LIBCPP_USING_IF_EXISTS;
using ::gmtime _LIBCPP_USING_IF_EXISTS;
using ::localtime _LIBCPP_USING_IF_EXISTS;
using ::mktime _LIBCPP_USING_IF_EXISTS;
- using ::strftime _LIBCPP_USING_IF_EXISTS;
using ::time _LIBCPP_USING_IF_EXISTS;
using ::timespec_get _LIBCPP_USING_IF_EXISTS;
+#endif
+
+// A workaround for UCRT because it defines these functions
+// as static and that causes the error "internal linkage cannot be exported"
+#ifdef _LIBCPP_ABI_VCRUNTIME
+
+ template <int = 0>
+ inline char* __CRTDECL ctime(_In_ time_t const* const _Time) noexcept {
+ return _ctime64(_Time);
+ }
+
+ template <int = 0>
+ inline double __CRTDECL difftime(_In_ time_t const _Time1, _In_ time_t const _Time2) noexcept {
+ return _difftime64(_Time1, _Time2);
+ }
+
+ template <int = 0>
+ inline tm* __CRTDECL gmtime(_In_ time_t const* const _Time) noexcept {
+ return _gmtime64(_Time);
+ }
+
+ template <int = 0>
+ inline tm* __CRTDECL localtime(_In_ time_t const* const _Time) noexcept {
+ return _localtime64(_Time);
+ }
+
+ template <int = 0>
+ inline time_t __CRTDECL mktime(_Inout_ tm* const _Tm) noexcept {
+ return _mktime64(_Tm);
+ }
+
+ template <int = 0>
+ inline time_t __CRTDECL time(_Out_opt_ time_t* const _Time) noexcept {
+ return _time64(_Time);
+ }
+
+ template <int = 0>
+ inline int __CRTDECL timespec_get(_Out_ timespec* const _Ts, _In_ int const _Base) noexcept {
+ return _timespec64_get(reinterpret_cast<_timespec64*>(_Ts), _Base);
+ }
+#endif
----------------
siradam7th wrote:
I don't see how it is trivial? even MSVC's STL has the same workaround because there has been no changes in UCRT in the past years, because of those few functions modules cannot be compiled.
https://github.com/llvm/llvm-project/pull/148992
More information about the libcxx-commits
mailing list