This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR libstdc++/81468 constrain std::chrono::time_point constructor


On 13/09/17 21:30 -0400, Tim Song wrote:
On Wed, Sep 13, 2017 at 10:55 AM, Jonathan Wakely <jwakely@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 <jwakely@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");

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]