From f2f48b68a6a586f40dd8ae0e6d391b7f88756eec Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 28 Aug 2020 23:41:13 +0100 Subject: 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> should be duration, P::type>, not duration. 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. libstdc++-v3/ChangeLog: * 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. --- libstdc++-v3/include/std/chrono | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'libstdc++-v3/include/std') diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono index fb25184..524d23e 100644 --- a/libstdc++-v3/include/std/chrono +++ b/libstdc++-v3/include/std/chrono @@ -114,13 +114,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct common_type, chrono::duration<_Rep, _Period>> - { using type = chrono::duration<_Rep, typename _Period::type>; }; + { + using type = chrono::duration::type, + typename _Period::type>; + }; /// Specialization of common_type for one chrono::duration type. /// @relates duration template struct common_type> - { using type = chrono::duration<_Rep, typename _Period::type>; }; + { + using type = chrono::duration::type, + typename _Period::type>; + }; // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly) @@ -463,13 +469,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // 20.11.5.3 arithmetic - constexpr duration + constexpr duration::type, period> operator+() const - { return *this; } + { return duration::type, period>(__r); } - constexpr duration + constexpr duration::type, period> operator-() const - { return duration(-__r); } + { return duration::type, period>(-__r); } _GLIBCXX17_CONSTEXPR duration& operator++() -- cgit v1.1