diff mbox

[v3] Resolve libstdc++/58850

Message ID 5267D80B.2030702@oracle.com
State New
Headers show

Commit Message

Paolo Carlini Oct. 23, 2013, 2:07 p.m. UTC
Hi,

strictly speaking this isn't a bug, is more a QoI issue, but it shows 
that the current minutes and hours typedefs we have got in <chrono>, 
while strictly speaking conforming, lead to "surprises":

     /// minutes typedef duration<int, ratio< 60>> minutes;
     /// hours typedef duration<int, ratio<3600>> hours;

that is, somewhat arbitrarily, while use int instead of int64_t, like we 
do for the others (for seconds, etc), only because on many targets, by 
no mean all, an int is typically 32 bits, thus the Standard requirements 
are fulfilled (it talks about at least 29 bits and at least 23 bits, 
respectively). Let's just use int64_t for all of them.

Tested x86_64-linux.

Thanks,
Paolo.

/////////////////////////////
2013-10-23  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/58850
	* include/std/chrono (minutes, hours): Change typedefs to uniformly
	use int64_t.
	* testsuite/20_util/duration/arithmetic/58850.cc: New.
diff mbox

Patch

Index: include/std/chrono
===================================================================
--- include/std/chrono	(revision 203955)
+++ include/std/chrono	(working copy)
@@ -524,22 +524,22 @@ 
       { return !(__lhs < __rhs); }
 
     /// nanoseconds
-    typedef duration<int64_t, nano> 	nanoseconds;
+    typedef duration<int64_t, nano> 	    nanoseconds;
 
     /// microseconds
-    typedef duration<int64_t, micro> 	microseconds;
+    typedef duration<int64_t, micro> 	    microseconds;
 
     /// milliseconds
-    typedef duration<int64_t, milli> 	milliseconds;
+    typedef duration<int64_t, milli> 	    milliseconds;
 
     /// seconds
-    typedef duration<int64_t> 		seconds;
+    typedef duration<int64_t> 		    seconds;
 
     /// minutes
-    typedef duration<int, ratio< 60>> 	minutes;
+    typedef duration<int64_t, ratio< 60>>   minutes;
 
     /// hours
-    typedef duration<int, ratio<3600>> 	hours;
+    typedef duration<int64_t, ratio<3600>>  hours;
 
     /// time_point
     template<typename _Clock, typename _Dur>
Index: testsuite/20_util/duration/arithmetic/58850.cc
===================================================================
--- testsuite/20_util/duration/arithmetic/58850.cc	(revision 0)
+++ testsuite/20_util/duration/arithmetic/58850.cc	(working copy)
@@ -0,0 +1,42 @@ 
+// { dg-options "-std=gnu++11" }
+// { dg-require-cstdint "" }
+
+// Copyright (C) 2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <chrono>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+  using namespace std::chrono;
+
+  typedef duration<std::int64_t, std::ratio<36 * 24 * 36525>> Years;
+  Years galactic_empire_age( 12067 );
+
+  VERIFY( duration_cast<seconds>( galactic_empire_age ).count()
+	  == duration_cast<minutes>( galactic_empire_age ).count() * 60 );
+  VERIFY( duration_cast<minutes>( galactic_empire_age ).count()
+	  == duration_cast<seconds>( galactic_empire_age ).count() / 60 );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}