QDateTime::fromStdTimePoint: fix the constraint
The constraint requires the input time_point's duration to be convertible to milliseconds. That's inaccurate: we need to check the duration of the time_point we get from the clock_cast, not the input. In general, clock_cast is allowed to return arbitrary durations, so it may not match the input. (It indeed doesn't match for some standard clocks, like gps_clock.) Task-number: QTBUG-125587 Change-Id: I5a93317c8cdc0a3cef4acab17c656e2e5dac5d8d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit e95812df85d98689d51bed92acce51e0e250f854) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
7f219f23b4
commit
6197078fbd
@ -5352,8 +5352,17 @@ QDateTime QDateTime::currentDateTimeUtc()
|
|||||||
Constructs a datetime representing the same point in time as \a time,
|
Constructs a datetime representing the same point in time as \a time,
|
||||||
using Qt::UTC as its specification.
|
using Qt::UTC as its specification.
|
||||||
|
|
||||||
The clock of \a time must be compatible with \c{std::chrono::system_clock},
|
The clock of \a time must be compatible with
|
||||||
and the duration type must be convertible to \c{std::chrono::milliseconds}.
|
\c{std::chrono::system_clock}; in particular, a conversion
|
||||||
|
supported by \c{std::chrono::clock_cast} must exist. After the
|
||||||
|
conversion, the duration type of the result must be convertible to
|
||||||
|
\c{std::chrono::milliseconds}.
|
||||||
|
|
||||||
|
If this is not the case, the caller must perform the necessary
|
||||||
|
clock conversion towards \c{std::chrono::system_clock} and the
|
||||||
|
necessary conversion of the duration type
|
||||||
|
(cast/round/floor/ceil/...) so that the input to this function
|
||||||
|
satisfies the constraints above.
|
||||||
|
|
||||||
\note This function requires C++20.
|
\note This function requires C++20.
|
||||||
|
|
||||||
|
@ -510,6 +510,17 @@ public:
|
|||||||
|
|
||||||
#if __cpp_lib_chrono >= 201907L || defined(Q_QDOC)
|
#if __cpp_lib_chrono >= 201907L || defined(Q_QDOC)
|
||||||
#if __cpp_concepts >= 201907L || defined(Q_QDOC)
|
#if __cpp_concepts >= 201907L || defined(Q_QDOC)
|
||||||
|
private:
|
||||||
|
// The duration type of the result of a clock_cast<system_clock>.
|
||||||
|
// This duration may differ from the duration of the input.
|
||||||
|
template <typename Clock, typename Duration>
|
||||||
|
using system_clock_cast_duration = decltype(
|
||||||
|
std::chrono::clock_cast<std::chrono::system_clock>(
|
||||||
|
std::declval<const std::chrono::time_point<Clock, Duration> &>()
|
||||||
|
).time_since_epoch()
|
||||||
|
);
|
||||||
|
|
||||||
|
public:
|
||||||
// Generic clock, as long as it's compatible with us (= system_clock)
|
// Generic clock, as long as it's compatible with us (= system_clock)
|
||||||
template <typename Clock, typename Duration>
|
template <typename Clock, typename Duration>
|
||||||
static QDateTime fromStdTimePoint(const std::chrono::time_point<Clock, Duration> &time)
|
static QDateTime fromStdTimePoint(const std::chrono::time_point<Clock, Duration> &time)
|
||||||
@ -517,8 +528,12 @@ public:
|
|||||||
requires(const std::chrono::time_point<Clock, Duration> &t) {
|
requires(const std::chrono::time_point<Clock, Duration> &t) {
|
||||||
// the clock can be converted to system_clock
|
// the clock can be converted to system_clock
|
||||||
std::chrono::clock_cast<std::chrono::system_clock>(t);
|
std::chrono::clock_cast<std::chrono::system_clock>(t);
|
||||||
// the duration can be converted to milliseconds
|
// after the conversion to system_clock, the duration type
|
||||||
requires std::is_convertible_v<Duration, std::chrono::milliseconds>;
|
// we get is convertible to milliseconds
|
||||||
|
requires std::is_convertible_v<
|
||||||
|
system_clock_cast_duration<Clock, Duration>,
|
||||||
|
std::chrono::milliseconds
|
||||||
|
>;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const auto sysTime = std::chrono::clock_cast<std::chrono::system_clock>(time);
|
const auto sysTime = std::chrono::clock_cast<std::chrono::system_clock>(time);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user