[committed] libstdc++: Make std::chrono::duration use reduced ratio for period

Jonathan Wakely jwakely@redhat.com
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.
             * testsuite/20_util/duration/requirements/reduced_period.cc:
             Check duration using a rep that has common_type specialized.

Tested powerpc64le-linux. Committed to trunk.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 4981 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20200829/dec4daa8/attachment.bin>

More information about the Libstdc++ mailing list