Simplify overflow checks in duration literals
authorJonathan Wakely <jwakely@redhat.com>
Tue, 14 Aug 2018 13:55:21 +0000 (14:55 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 14 Aug 2018 13:55:21 +0000 (14:55 +0100)
* include/std/chrono (__check_overflow): Simplify definition.
(_Checked_integral_constant): Remove.

From-SVN: r263537

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/chrono

index 15ff3db6134b5723a329e455d32cc54951c9ffd1..cf69f2160723a7738ee6a041c4278b30a324caf4 100644 (file)
@@ -1,5 +1,8 @@
 2018-08-14  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/std/chrono (__check_overflow): Simplify definition.
+       (_Checked_integral_constant): Remove.
+
        PR libstdc++/86846
        * src/c++17/default_resource.h: New file, defining default_res.
        * src/c++17/memory_resource.cc [ATOMIC_POINTER_LOCK_FREE != 2]
index da03fdccce44d6da493107340989c2c983bad412..871c896144a23f37de858668a16388a4bc884d56 100644 (file)
@@ -900,24 +900,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   {
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wliteral-suffix"
-    template<typename _Rep, unsigned long long _Val>
-      struct _Checked_integral_constant
-      : integral_constant<_Rep, static_cast<_Rep>(_Val)>
-      {
-       static_assert(_Checked_integral_constant::value >= 0
-                     && _Checked_integral_constant::value == _Val,
-                     "literal value cannot be represented by duration type");
-      };
-
     template<typename _Dur, char... _Digits>
       constexpr _Dur __check_overflow()
       {
        using _Val = __parse_int::_Parse_int<_Digits...>;
-       using _Rep = typename _Dur::rep;
-       // TODO: should be simply integral_constant<_Rep, _Val::value>
-       // but GCC doesn't reject narrowing conversions to _Rep.
-       using _CheckedVal = _Checked_integral_constant<_Rep, _Val::value>;
-       return _Dur{_CheckedVal::value};
+       constexpr typename _Dur::rep __repval = _Val::value;
+       static_assert(__repval >= 0 && __repval == _Val::value,
+                     "literal value cannot be represented by duration type");
+       return _Dur(__repval);
       }
 
     constexpr chrono::duration<long double, ratio<3600,1>>