[committed] libstdc++: Make std::chrono::duration use reduced ratio for period
Fri Aug 28 23:49:50 GMT 2020
On 27/08/20 22:41 +0100, Jonathan Wakely wrote:
>This implements the changes from P0548 "common_type and duration". That
>was a change for C++17, but as it corrects some issues introduced by DRs
>I'm also treating it as a DR and changing it for all modes from C++11
>The main change is that duration<R,P>::period no longer denotes P, but
>rather P::type, the reduced ratio. The unary operator+ and operator-
>members of duration should now return a duration using that reduced
>The requirement that common_type<T>::type is the same type as
>common_type<T, T>::type (rather than simply T) was already implemented
>for PR 89102.
>The standard says that duration::operator+() and duration::operator-()
>should return common_type_t<duration>, but that seems unnecessarily
>expensive to compute. This change just uses duration<rep, period> which
>is the same type, so we don't need to instantiate common_type.
>As an optimization, this also adds partial specializations of
>common_type for two durations of the same type, a single duration, two
>time_points of the same type, and a single time_point. These
>specializations avoid instantiating other specializations of common_type
>and one or both of __duration_common_type or __timepoint_common_type for
>the cases where the answer is trivial to obtain.
> * include/std/chrono (__duration_common_type): Ensure the
> reduced ratio is used. Remove unused partial specialization
> using __failure_type.
> (common_type): Pass reduced ratios to __duration_common_type.
> Add partial specializations for simple cases involving a single
> duration or time_point type.
> (duration::period): Use reduced ratio.
> (duration::operator+(), duration::operator-()): Return duration
> type using the reduced ratio.
> * testsuite/20_util/duration/requirements/typedefs_neg2.cc:
> Adjust expected errors.
> * testsuite/20_util/duration/requirements/reduced_period.cc: New test.
>Tested powerpc64le-linux. Committed to trunk.
>This is a C++17 feature, so I think it would be good to backport it to
>gcc-10 as well. I'll let it bake on trunk for a while first though.
A correction ...
libstdc++: Fix common_type specializations for duration
My recent change to implement P0548 ("common_type and duration") was not
correct. The result of common_type_t<duration<R,P>, duration<R,P>>
should be duration<common_type_t<R>, P::type>, not duration<R, P::type>.
The common_type specialization for two different duration types was
correct, but the specializations for a single duration type (which only
exist to optimize compilation time) were wrong.
This fixes the partial specializations of common_type for a single
duration type, and also the return types of duration::operator+ and
duration::operator- which are supposed to use common_type_t<duration>.
* include/std/chrono (common_type): Fix partial specializations
for a single duration type to use the common_type of the rep.
(duration::operator+, duration::operator-): Fix return types
to also use the common_type of the rep.
Check duration using a rep that has common_type specialized.
Tested powerpc64le-linux. Committed to trunk.
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 4981 bytes
Desc: not available
More information about the Libstdc++