diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-11-01 00:35:40 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-11-01 00:35:40 +0000 |
commit | c79d28f3ee18ba9cd630f15c9fd167a8bbb1d37d (patch) | |
tree | 8ddb01cd153663677b0905e4f55d5fe270042891 /libstdc++-v3 | |
parent | d06b63705eec184b9abf8a04062e1cc16a6da700 (diff) | |
download | gcc-c79d28f3ee18ba9cd630f15c9fd167a8bbb1d37d.tar.gz |
2009-10-31 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/chrono (struct __common_rep_type): New.
(duration_cast(const duration<>&),
duration<>::duration(const _Rep2&),
duration<>::duration(const duration<>&),
operator*(const duration<>&, const _Rep2&),
operator*(const _Rep1&, const duration<>&),
operator/(const duration<>&, const _Rep2&),
time_point_cast(const time_point<>&)): Implement resolution of
DR 1177 ([Ready] in Santa Cruz), change to not participate to
overload resolution if the constraints are not met.
* testsuite/20_util/duration/cons/1_neg.cc: Adjust dg-errors.
* testsuite/20_util/duration/cons/dr974.cc: Likewise.
* testsuite/20_util/duration/requirements/typedefs_neg1.cc: Adjust
dg-error line numbers.
* testsuite/20_util/duration/requirements/typedefs_neg2.cc: Likewise.
* testsuite/20_util/duration/requirements/typedefs_neg3.cc: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153787 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
7 files changed, 64 insertions, 48 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c97e46b96d9..91d2a598ee5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,22 @@ +2009-10-31 Paolo Carlini <paolo.carlini@oracle.com> + + * include/std/chrono (struct __common_rep_type): New. + (duration_cast(const duration<>&), + duration<>::duration(const _Rep2&), + duration<>::duration(const duration<>&), + operator*(const duration<>&, const _Rep2&), + operator*(const _Rep1&, const duration<>&), + operator/(const duration<>&, const _Rep2&), + time_point_cast(const time_point<>&)): Implement resolution of + DR 1177 ([Ready] in Santa Cruz), change to not participate to + overload resolution if the constraints are not met. + * testsuite/20_util/duration/cons/1_neg.cc: Adjust dg-errors. + * testsuite/20_util/duration/cons/dr974.cc: Likewise. + * testsuite/20_util/duration/requirements/typedefs_neg1.cc: Adjust + dg-error line numbers. + * testsuite/20_util/duration/requirements/typedefs_neg2.cc: Likewise. + * testsuite/20_util/duration/requirements/typedefs_neg3.cc: Likewise. + 2009-10-31 Gerald Pfeifer <gerald@pfeifer.com> * doc/xml/manual/intro.xml: Refer to our bugs page instead of diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono index 300c13ce97e..e80ec13c093 100644 --- a/libstdc++-v3/include/std/chrono +++ b/libstdc++-v3/include/std/chrono @@ -138,9 +138,20 @@ namespace std } }; + template<typename _Tp> + struct __is_duration + : std::false_type + { }; + + template<typename _Rep, typename _Period> + struct __is_duration<duration<_Rep, _Period>> + : std::true_type + { }; + /// duration_cast template<typename _ToDuration, typename _Rep, typename _Period> - inline _ToDuration + inline typename enable_if<__is_duration<_ToDuration>::value, + _ToDuration>::type duration_cast(const duration<_Rep, _Period>& __d) { typedef typename @@ -175,16 +186,6 @@ namespace std { return numeric_limits<_Rep>::min(); } }; - template<typename _Tp> - struct __is_duration - : std::false_type - { }; - - template<typename _Rep, typename _Period> - struct __is_duration<duration<_Rep, _Period>> - : std::true_type - { }; - template<typename T> struct __is_ratio : std::false_type @@ -210,25 +211,19 @@ namespace std // 20.8.3.1 construction / copy / destroy duration() = default; - template<typename _Rep2> + template<typename _Rep2, typename = typename + enable_if<is_convertible<_Rep2, rep>::value + && (treat_as_floating_point<rep>::value + || !treat_as_floating_point<_Rep2>::value)>::type> explicit duration(const _Rep2& __rep) - : __r(static_cast<rep>(__rep)) - { - static_assert(is_convertible<_Rep2,rep>::value - && (treat_as_floating_point<rep>::value - || !treat_as_floating_point<_Rep2>::value), - "cannot construct integral duration with floating point type"); - } + : __r(static_cast<rep>(__rep)) { } - template<typename _Rep2, typename _Period2> + template<typename _Rep2, typename _Period2, typename = typename + enable_if<treat_as_floating_point<rep>::value + || (ratio_divide<_Period2, period>::type::den == 1 + && !treat_as_floating_point<_Rep2>::value)>::type> duration(const duration<_Rep2, _Period2>& __d) - : __r(duration_cast<duration>(__d).count()) - { - static_assert(treat_as_floating_point<rep>::value == true - || (ratio_divide<_Period2, period>::type::den == 1 - && !treat_as_floating_point<_Rep2>::value), - "the resulting duration is not exactly representable"); - } + : __r(duration_cast<duration>(__d).count()) { } ~duration() = default; duration(const duration&) = default; @@ -359,8 +354,17 @@ namespace std return __ct(__lhs) -= __rhs; } + template<typename _Rep1, typename _Rep2, bool = + is_convertible<_Rep2, + typename common_type<_Rep1, _Rep2>::type>::value> + struct __common_rep_type { }; + + template<typename _Rep1, typename _Rep2> + struct __common_rep_type<_Rep1, _Rep2, true> + { typedef typename common_type<_Rep1, _Rep2>::type type; }; + template<typename _Rep1, typename _Period, typename _Rep2> - inline duration<typename common_type<_Rep1, _Rep2>::type, _Period> + inline duration<typename __common_rep_type<_Rep1, _Rep2>::type, _Period> operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s) { typedef typename common_type<_Rep1, _Rep2>::type __cr; @@ -368,12 +372,12 @@ namespace std } template<typename _Rep1, typename _Period, typename _Rep2> - inline duration<typename common_type<_Rep1, _Rep2>::type, _Period> - operator*(const _Rep2& __s, const duration<_Rep1, _Period>& __d) + inline duration<typename __common_rep_type<_Rep2, _Rep1>::type, _Period> + operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d) { return __d * __s; } template<typename _Rep1, typename _Period, typename _Rep2> - inline duration<typename common_type<_Rep1, typename + inline duration<typename __common_rep_type<_Rep1, typename enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period> operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s) { @@ -394,7 +398,7 @@ namespace std // DR 934. template<typename _Rep1, typename _Period, typename _Rep2> - inline duration<typename common_type<_Rep1, typename + inline duration<typename __common_rep_type<_Rep1, typename enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period> operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s) { @@ -541,7 +545,8 @@ namespace std /// time_point_cast template<typename _ToDuration, typename _Clock, typename _Duration> - inline time_point<_Clock, _ToDuration> + inline typename enable_if<__is_duration<_ToDuration>::value, + time_point<_Clock, _ToDuration>>::type time_point_cast(const time_point<_Clock, _Duration>& __t) { return time_point<_Clock, _ToDuration>( diff --git a/libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc b/libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc index 40d8219093e..56b4e4f413e 100644 --- a/libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc +++ b/libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc @@ -26,7 +26,7 @@ void test01() { - std::chrono::duration<int> d1(1.0); + std::chrono::duration<int> d1(1.0); // { dg-error "no matching" } } void @@ -35,11 +35,7 @@ test02() using namespace std::chrono; duration<int, std::micro> d2(8); - duration<int, std::milli> d2_copy(d2); + duration<int, std::milli> d2_copy(d2); // { dg-error "no matching" } } -// { dg-error "instantiated from here" "" { target *-*-* } 29 } -// { dg-error "instantiated from here" "" { target *-*-* } 38 } -// { dg-error "not exactly representable" "" { target *-*-* } 227 } -// { dg-error "integral duration with floating point" "" { target *-*-* } 217 } -// { dg-excess-errors "In instantiation of" } +// { dg-excess-errors "candidates are" } diff --git a/libstdc++-v3/testsuite/20_util/duration/cons/dr974.cc b/libstdc++-v3/testsuite/20_util/duration/cons/dr974.cc index 43132c9867c..4466d30097a 100644 --- a/libstdc++-v3/testsuite/20_util/duration/cons/dr974.cc +++ b/libstdc++-v3/testsuite/20_util/duration/cons/dr974.cc @@ -29,9 +29,5 @@ void test01() using namespace std::chrono; duration<double> d(3.5); - duration<int> i = d; // implicit truncation, should not compile + duration<int> i = d; // { dg-error "conversion" } } - -// { dg-error "instantiated from here" "" { target *-*-* } 32 } -// { dg-error "not exactly representable" "" { target *-*-* } 227 } -// { dg-excess-errors "In instantiation of" } diff --git a/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg1.cc b/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg1.cc index e8b6d33a1ea..297b5cb690d 100644 --- a/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg1.cc +++ b/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg1.cc @@ -31,6 +31,6 @@ void test01() test_type d; } -// { dg-error "rep cannot be a duration" "" { target *-*-* } 202 } +// { dg-error "rep cannot be a duration" "" { target *-*-* } 203 } // { dg-error "instantiated from here" "" { target *-*-* } 31 } // { dg-excess-errors "In instantiation of" } diff --git a/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg2.cc b/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg2.cc index 91081836779..b83bf494db5 100644 --- a/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg2.cc +++ b/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg2.cc @@ -32,6 +32,6 @@ void test01() test_type d; } -// { dg-error "must be a specialization of ratio" "" { target *-*-* } 203 } +// { dg-error "must be a specialization of ratio" "" { target *-*-* } 204 } // { dg-error "instantiated from here" "" { target *-*-* } 32 } // { dg-excess-errors "In instantiation of" } diff --git a/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg3.cc b/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg3.cc index 540d72dde46..b4224401d47 100644 --- a/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg3.cc +++ b/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg3.cc @@ -33,6 +33,6 @@ void test01() test_type d; } -// { dg-error "period must be positive" "" { target *-*-* } 205 } +// { dg-error "period must be positive" "" { target *-*-* } 206 } // { dg-error "instantiated from here" "" { target *-*-* } 33 } // { dg-excess-errors "In instantiation of" } |