On 13/09/17 21:30 -0400, Tim Song wrote:
On Wed, Sep 13, 2017 at 10:55 AM, Jonathan Wakely <jwak...@redhat.com> wrote:
+// DR 1177
+static_assert(is_constructible<duration<float>, duration<double>>{},
+ "can convert duration with one floating point rep to another");
+static_assert(is_constructible<duration<float>, duration<int>>{},
+ "can convert duration with integral rep to one with floating point rep");
+static_assert(!is_constructible<duration<int>, duration<float>>{},
+ "cannot convert duration with floating point rep to one with integral
rep");
+static_assert(is_constructible<duration<int>, duration<long>>{},
+ "can convert duration with one integral rep to another");
+
+static_assert(!is_constructible<duration<int>, duration<int, ratio<2,3>>>{},
+ "cannot convert duration to one with different period");
+static_assert(is_constructible<duration<float>, duration<int, ratio<2,3>>>{},
+ "unless it has a floating-point representation");
"it" is a little ambiguous here unless you read the next message's
mention of "the original"...
+static_assert(is_constructible<duration<float>, duration<int, ratio<1,3>>>{},
+ "or a period that is an integral multiple of the original");
This is backwards: duration<Inty, P1> is convertible to duration<Inty,
P2> iff P1 is an integral multiple of P2, i.e., if the original's
period is an integral multiple of "its" period.
The static assert only passed because duration<float> was used as the
destination type (presumably because of a copy/paste error).
Tim
Good catch, thanks.
I've committed this patch.
commit 5c021e19e0758e5ad7e47feadbd0632b15f85785
Author: Jonathan Wakely <jwak...@redhat.com>
Date: Mon Sep 18 19:04:25 2017 +0100
PR libstdc++/81468 fix test for duration conversions
PR libstdc++/81468
* testsuite/20_util/duration/cons/dr1177.cc: Fix incorrect test and
improve static assertion messages.
diff --git a/libstdc++-v3/testsuite/20_util/duration/cons/dr1177.cc b/libstdc++-v3/testsuite/20_util/duration/cons/dr1177.cc
index 28c881ccc79..d90cd27f482 100644
--- a/libstdc++-v3/testsuite/20_util/duration/cons/dr1177.cc
+++ b/libstdc++-v3/testsuite/20_util/duration/cons/dr1177.cc
@@ -36,6 +36,6 @@ static_assert(is_constructible<duration<int>, duration<long>>{},
static_assert(!is_constructible<duration<int>, duration<int, ratio<2,3>>>{},
"cannot convert duration to one with different period");
static_assert(is_constructible<duration<float>, duration<int, ratio<2,3>>>{},
- "unless it has a floating-point representation");
-static_assert(is_constructible<duration<float>, duration<int, ratio<1,3>>>{},
- "or a period that is an integral multiple of the original");
+ "... unless the result type has a floating-point representation");
+static_assert(is_constructible<duration<int, ratio<1,3>>, duration<int>>{},
+ "... or the original's period is a multiple of the result's period");