From: Hugo Beauzée-Luyssen <[email protected]>
The C++20 chrono time zone API is declared when
_GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI, but
__cpp_lib_chrono only gets its C++20 value when
_GLIBCXX_USE_CXX11_ABI is set. Old-ABI-only builds therefore get
the full API but report the C++17 value.
Widen the condition for the 201907 value to match, and make the
headers check __cpp_lib_chrono instead of repeating the ABI
condition.
libstdc++-v3/ChangeLog:
* include/bits/version.def (chrono): Also define 201907 for
old-ABI-only builds.
* include/bits/version.h: Regenerate.
* include/std/chrono: Check __cpp_lib_chrono instead of the
ABI macros.
* include/bits/chrono_io.h: Likewise.
Assisted-by: Claude (claude-sonnet-5)
Signed-off-by: Hugo Beauzée-Luyssen <[email protected]>
---
libstdc++-v3/include/bits/chrono_io.h | 8 ++++----
libstdc++-v3/include/bits/version.def | 2 +-
libstdc++-v3/include/bits/version.h | 2 +-
libstdc++-v3/include/std/chrono | 12 ++++++------
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/libstdc++-v3/include/bits/chrono_io.h
b/libstdc++-v3/include/bits/chrono_io.h
index 028e6007544..b9e2bb28002 100644
--- a/libstdc++-v3/include/bits/chrono_io.h
+++ b/libstdc++-v3/include/bits/chrono_io.h
@@ -2083,7 +2083,7 @@ namespace __format
}
};
-#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
+#if __cpp_lib_chrono >= 201803L
template<typename _CharT>
struct __formatter_chrono_info
{
@@ -3004,7 +3004,7 @@ namespace __format
= enable_nonlocking_formatter_optimization<_Duration>;
#endif
-#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
+#if __cpp_lib_chrono >= 201803L
template<__format::__char _CharT>
struct formatter<chrono::sys_info, _CharT>
{
@@ -3395,7 +3395,7 @@ namespace __format
= enable_nonlocking_formatter_optimization<_Duration>;
#endif
-#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
+#if __cpp_lib_chrono >= 201803L
template<typename _Duration, typename _TimeZonePtr, __format::__char _CharT>
struct formatter<chrono::zoned_time<_Duration, _TimeZonePtr>, _CharT>
: formatter<chrono::__detail::__local_time_fmt_for<_Duration>, _CharT>
@@ -3872,7 +3872,7 @@ namespace __detail
return __detail::__chrono_write<64>(__os, __hms, __os.getloc());
}
-#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
+#if __cpp_lib_chrono >= 201803L
/// Writes a sys_info object to an ostream in an unspecified format.
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
diff --git a/libstdc++-v3/include/bits/version.def
b/libstdc++-v3/include/bits/version.def
index 9c523581c65..38ff5364a71 100644
--- a/libstdc++-v3/include/bits/version.def
+++ b/libstdc++-v3/include/bits/version.def
@@ -622,7 +622,7 @@ ftms = {
v = 201907;
cxxmin = 20;
hosted = yes;
- cxx11abi = yes; // std::chrono::tzdb requires cxx11 std::string
+ extra_cond = "(_GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI)";
};
values = {
v = 201611;
diff --git a/libstdc++-v3/include/bits/version.h
b/libstdc++-v3/include/bits/version.h
index e0003054af6..1d62f362eb1 100644
--- a/libstdc++-v3/include/bits/version.h
+++ b/libstdc++-v3/include/bits/version.h
@@ -686,7 +686,7 @@
# if defined(__glibcxx_want_all) || defined(__glibcxx_want_chrono)
# define __cpp_lib_chrono 202306L
# endif
-# elif (__cplusplus >= 202002L) && _GLIBCXX_USE_CXX11_ABI && _GLIBCXX_HOSTED
+# elif (__cplusplus >= 202002L) && _GLIBCXX_HOSTED && ((_GLIBCXX_USE_CXX11_ABI
|| !_GLIBCXX_USE_DUAL_ABI))
# define __glibcxx_chrono 201907L
# if defined(__glibcxx_want_all) || defined(__glibcxx_want_chrono)
# define __cpp_lib_chrono 201907L
diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono
index faa849b75b3..9c8a5ced2bc 100644
--- a/libstdc++-v3/include/std/chrono
+++ b/libstdc++-v3/include/std/chrono
@@ -57,7 +57,7 @@
# include <bits/stl_algo.h> // upper_bound
# include <bits/range_access.h> // begin/end for arrays
#endif
-#if __cpp_lib_chrono >= 201803L // C++20 && HOSTED && USE_CXX11_ABI
+#if __cpp_lib_chrono >= 201803L // C++20 && HOSTED
# include <sstream>
# include <string>
# include <vector>
@@ -2529,7 +2529,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
#if _GLIBCXX_HOSTED
-#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
+#if __cpp_lib_chrono >= 201803L
// C++20 [time.zones] Time zones
struct tzdb;
@@ -3204,7 +3204,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
using zoned_seconds = zoned_time<seconds>;
-#endif // _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
+#endif // __cpp_lib_chrono >= 201803L
namespace __detail
{
@@ -3259,7 +3259,7 @@ namespace __detail
if (__ss > __expires)
{
-#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI // use chrono::tzdb
+#if __cpp_lib_chrono >= 201803L // use chrono::tzdb
// Call into the library because it might have knowledge of new
// leap seconds loaded at runtime from the tzdata files.
@@ -3586,7 +3586,7 @@ namespace __detail
};
#if _GLIBCXX_HOSTED
-#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
+#if __cpp_lib_chrono >= 201803L
// zoned_time
template<typename _Duration, typename _TimeZonePtr>
requires __is_hash_enabled_for<
@@ -3643,7 +3643,7 @@ namespace __detail
__val.value().count());
}
};
-#endif // _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
+#endif // __cpp_lib_chrono >= 201803L
#endif // _GLIBCXX_HOSTED
#endif // __glibcxx_chrono_cxx20 >= 202306
--
2.43.0