summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-01 00:35:40 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-01 00:35:40 +0000
commitc79d28f3ee18ba9cd630f15c9fd167a8bbb1d37d (patch)
tree8ddb01cd153663677b0905e4f55d5fe270042891 /libstdc++-v3
parentd06b63705eec184b9abf8a04062e1cc16a6da700 (diff)
downloadgcc-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')
-rw-r--r--libstdc++-v3/ChangeLog19
-rw-r--r--libstdc++-v3/include/std/chrono71
-rw-r--r--libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc10
-rw-r--r--libstdc++-v3/testsuite/20_util/duration/cons/dr974.cc6
-rw-r--r--libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg1.cc2
-rw-r--r--libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg2.cc2
-rw-r--r--libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg3.cc2
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" }