must be present on all vector operations or none, so this macro must
be defined to the same value for all translation units that create,
destroy, or modify vectors.
+ </p></dd><dt><span class="term"><code class="code">_GLIBCXX_NO_FREESTANDING_CHRONO</code></span></dt><dd><p>
+ Undefined by default. When defined, the
+ <code class="filename"><chrono></code> header cannot
+ be used with <code class="option">-ffreestanding</code>.
+ When not defined, durations, time points, and calendar types are
+ available for freestanding, but the standard clocks and the time zone
+ database are not (because they require OS support).
</p></dd></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="using_headers.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="using.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="using_dual_abi.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Headers </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Dual ABI</td></tr></table></div></body></html>
\ No newline at end of file
destroy, or modify vectors.
</para>
</listitem></varlistentry>
+
+ <varlistentry><term><code>_GLIBCXX_NO_FREESTANDING_CHRONO</code></term>
+ <listitem>
+ <para>
+ Undefined by default. When defined, the
+ <filename class="headerfile"><chrono></filename> header cannot
+ be used with <option>-ffreestanding</option>.
+ When not defined, durations, time points, and calendar types are
+ available for freestanding, but the standard clocks and the time zone
+ database are not (because they require OS support).
+ </para>
+ </listitem></varlistentry>
</variablelist>
</section>
#include <ratio>
#include <type_traits>
#include <limits>
-#include <ctime>
+#if _GLIBCXX_HOSTED
+# include <ctime>
+#endif
#include <bits/parse_numbers.h> // for literals support.
#if __cplusplus >= 202002L
# include <concepts>
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
-#if __cplusplus >= 201703L
+#if __cplusplus >= 201703L && _GLIBCXX_HOSTED
namespace filesystem { struct __file_clock; };
#endif
{ };
#endif // C++20
-#ifdef __glibcxx_chrono // C++ >= 17 && HOSTED
+#if __cplusplus >= 201703L // C++ >= 17
/** Convert a `duration` to type `ToDur` and round down.
*
* If the duration cannot be represented exactly in the result type,
/// @}
/// @} group chrono
+#if _GLIBCXX_HOSTED
// Clocks.
// Why nanosecond resolution as the default?
template<> inline constexpr bool is_clock_v<file_clock> = true;
/// @}
#endif // C++20
+#elif __cplusplus >= 202002L
+ // Define a fake clock like chrono::local_t so that sys_time etc.
+ // can be used for freestanding.
+ struct __sys_t;
+ template<typename _Duration>
+ using sys_time = time_point<__sys_t, _Duration>;
+ using sys_seconds = sys_time<seconds>;
+ using sys_days = sys_time<days>;
+#endif // _GLIBCXX_HOSTED
} // namespace chrono
-#ifdef __glibcxx_chrono_udls // C++ >= 14 && HOSTED
+#ifdef __glibcxx_chrono_udls // C++ >= 14
inline namespace literals
{
/** ISO C++ 2014 namespace for suffixes for duration literals.
} // namespace chrono
#endif // __glibcxx_chrono_udls
-#if __cplusplus >= 201703L
+#if __cplusplus >= 201703L && _GLIBCXX_HOSTED
namespace filesystem
{
struct __file_clock
}
};
} // namespace filesystem
-#endif // C++17
+#endif // C++17 && HOSTED
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
values = {
v = 201304;
cxxmin = 14;
- hosted = yes;
};
};
#undef __glibcxx_want_to_chars
#if !defined(__cpp_lib_chrono_udls)
-# if (__cplusplus >= 201402L) && _GLIBCXX_HOSTED
+# if (__cplusplus >= 201402L)
# define __glibcxx_chrono_udls 201304L
# if defined(__glibcxx_want_all) || defined(__glibcxx_want_chrono_udls)
# define __cpp_lib_chrono_udls 201304L
#pragma GCC system_header
-#include <bits/requires_hosted.h> // for <ctime> and clocks
+#ifdef _GLIBCXX_NO_FREESTANDING_CHRONO
+# include <bits/requires_hosted.h> // for <ctime> and clocks
+#endif
#if __cplusplus < 201103L
# include <bits/c++0x_warning.h>
#include <bits/chrono.h>
#if __cplusplus >= 202002L
-# include <bit>
+# include <bit> // __countr_zero
+#endif
+#if __cplusplus >= 202002L && _GLIBCXX_HOSTED
# include <sstream>
# include <string>
# include <vector>
using local_seconds = local_time<seconds>;
using local_days = local_time<days>;
+#if _GLIBCXX_HOSTED
class utc_clock;
class tai_clock;
class gps_clock;
return gps_time<_CDur>{__t.time_since_epoch()} - 315964809s;
}
};
-
+#endif // _GLIBCXX_HOSTED
template<typename _DestClock, typename _SourceClock>
struct clock_time_conversion
{ return __t; }
};
+#if _GLIBCXX_HOSTED
template<>
struct clock_time_conversion<system_clock, system_clock>
{
return _DestClock::from_utc(__t);
}
};
+#endif // _GLIBCXX_HOSTED
/// @cond undocumented
namespace __detail
clock_time_conversion<_DestClock, _SourceClock>{}(__t);
};
+#if _GLIBCXX_HOSTED
template<typename _DestClock, typename _SourceClock, typename _Duration>
concept __clock_convs_sys
= requires (const time_point<_SourceClock, _Duration>& __t) {
clock_time_conversion<system_clock, utc_clock>{}(
clock_time_conversion<utc_clock, _SourceClock>{}(__t)));
};
-
+#endif // _GLIBCXX_HOSTED
} // namespace __detail
/// @endcond
inline auto
clock_cast(const time_point<_SourceClock, _Duration>& __t)
requires __detail::__clock_convs<_DestClock, _SourceClock, _Duration>
+#if _GLIBCXX_HOSTED
|| __detail::__clock_convs_sys<_DestClock, _SourceClock, _Duration>
|| __detail::__clock_convs_utc<_DestClock, _SourceClock, _Duration>
|| __detail::__clock_convs_sys_utc<_DestClock, _SourceClock, _Duration>
|| __detail::__clock_convs_utc_sys<_DestClock, _SourceClock, _Duration>
+#endif // _GLIBCXX_HOSTED
{
constexpr bool __direct
= __detail::__clock_convs<_DestClock, _SourceClock, _Duration>;
{
return clock_time_conversion<_DestClock, _SourceClock>{}(__t);
}
+#if _GLIBCXX_HOSTED
else
{
constexpr bool __convert_via_sys_clock
}
}
}
+#endif // _GLIBCXX_HOSTED
}
// CALENDRICAL TYPES
}
}
+#if _GLIBCXX_HOSTED
#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
// C++20 [time.zones] Time zones
const auto __li = __detail::__get_leap_second_info(__s, false);
return utc_time<_CDur>{__t.time_since_epoch()} + __li.elapsed;
}
+#endif // _GLIBCXX_HOSTED
/// @} group chrono
#endif // C++20
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
-#if __cplusplus >= 202002L
+#if __cplusplus >= 202002L && _GLIBCXX_HOSTED
# include <bits/chrono_io.h>
#endif
--- /dev/null
+// { dg-options "-ffreestanding" }
+// { dg-do compile { target c++11 } }
+
+#include <chrono>
+
+using namespace std::chrono;
+
+milliseconds
+test_duration()
+{
+ seconds sec{1};
+ sec = sec + -sec;
+ return duration_cast<milliseconds>(sec + microseconds{100});
+}
+
+struct Clock
+{
+ using rep = long;
+ using period = std::ratio<1,10>;
+ using duration = std::chrono::duration<rep, period>;
+ using time_point = std::chrono::time_point<Clock>;
+
+ static const bool is_steady = true;
+
+ static time_point now() noexcept
+ {
+ static time_point tick{duration{0}};
+ return tick + tick.time_since_epoch();
+ }
+};
+
+Clock::time_point
+test_time_point()
+{
+ auto t = Clock::now() + milliseconds{1};
+ return time_point_cast<Clock::duration>(t);
+}
+
+#if __cplusplus > 202002L
+static_assert( is_clock_v<Clock> );
+
+bool
+test_calendar()
+{
+ auto t = test_time_point();
+ t = clock_cast<Clock>(t);
+ local_days d{floor<days>(t + 1h + 1min + 1s).time_since_epoch()};
+ year_month_day ymd{d};
+ weekday w{d};
+ return w.ok();
+}
+#endif