LWG 3050 Fix cv-qualification of convertibility constraints
authorJonathan Wakely <jwakely@redhat.com>
Mon, 18 Jun 2018 18:02:24 +0000 (19:02 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 18 Jun 2018 18:02:24 +0000 (19:02 +0100)
LWG 3050 Fix cv-qualification of convertibility constraints
* include/std/chrono (duration, operator*, operator/, operator%): Use
const-qualified type as source type in is_convertible constraints.
* testsuite/20_util/duration/arithmetic/dr3050.cc: New.
* testsuite/20_util/duration/cons/dr3050.cc: New.
* testsuite/20_util/duration/literals/range.cc: Rename to...
* testsuite/20_util/duration/literals/range_neg.cc: Here. Adjust
dg-error lineno.

From-SVN: r261708

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/chrono
libstdc++-v3/testsuite/20_util/duration/cons/dr3050.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/duration/literals/range.cc [deleted file]
libstdc++-v3/testsuite/20_util/duration/literals/range_neg.cc [new file with mode: 0644]

index 0af7c93227e7bd11d35b4f3ad3c44826ed70bbcf..bdf20606bc9a3ad9a0c3a0ac3843f40b7deb5926 100644 (file)
@@ -1,3 +1,14 @@
+2018-06-18  Jonathan Wakely  <jwakely@redhat.com>
+
+       LWG 3050 Fix cv-qualification of convertibility constraints
+       * include/std/chrono (duration, operator*, operator/, operator%): Use
+       const-qualified type as source type in is_convertible constraints.
+       * testsuite/20_util/duration/arithmetic/dr3050.cc: New.
+       * testsuite/20_util/duration/cons/dr3050.cc: New.
+       * testsuite/20_util/duration/literals/range.cc: Rename to...
+       * testsuite/20_util/duration/literals/range_neg.cc: Here. Adjust
+       dg-error lineno.
+
 2018-06-18  Maya Rashish  <coypu@sdf.org>
 
        * crossconfig.m4: Handle OpenBSD just like NetBSD.
index b3a0cb2087d9f2c7ffd993ee166f7930d82b2f65..d6d9dcae411e11cd5dbe0e524170185f6febcaee 100644 (file)
@@ -325,8 +325,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
        duration(const duration&) = default;
 
+       // _GLIBCXX_RESOLVE_LIB_DEFECTS
+       // 3050. Conversion specification problem in chrono::duration
        template<typename _Rep2, typename = _Require<
-                is_convertible<_Rep2, rep>,
+                is_convertible<const _Rep2&, rep>,
                 __or_<__is_float<rep>, __not_<__is_float<_Rep2>>>>>
          constexpr explicit duration(const _Rep2& __rep)
          : __r(static_cast<rep>(__rep)) { }
@@ -471,10 +473,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     // SFINAE helper to obtain common_type<_Rep1, _Rep2> only if _Rep2
     // is implicitly convertible to it.
+    // _GLIBCXX_RESOLVE_LIB_DEFECTS
+    // 3050. Conversion specification problem in chrono::duration constructor
     template<typename _Rep1, typename _Rep2,
             typename _CRep = typename common_type<_Rep1, _Rep2>::type>
-      using __common_rep_t
-       = typename enable_if<is_convertible<_Rep2, _CRep>::value, _CRep>::type;
+      using __common_rep_t = typename
+       enable_if<is_convertible<const _Rep2&, _CRep>::value, _CRep>::type;
 
     template<typename _Rep1, typename _Period, typename _Rep2>
       constexpr duration<__common_rep_t<_Rep1, _Rep2>, _Period>
diff --git a/libstdc++-v3/testsuite/20_util/duration/cons/dr3050.cc b/libstdc++-v3/testsuite/20_util/duration/cons/dr3050.cc
new file mode 100644 (file)
index 0000000..a4f57a3
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright (C) 2018 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/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <chrono>
+
+struct X { operator int64_t() /* not const */; };
+static_assert(!std::is_constructible<std::chrono::seconds, X>::value,
+             "LWG 3050");
diff --git a/libstdc++-v3/testsuite/20_util/duration/literals/range.cc b/libstdc++-v3/testsuite/20_util/duration/literals/range.cc
deleted file mode 100644 (file)
index a1706d3..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// { dg-do compile { target c++14 } }
-
-// Copyright (C) 2014-2018 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>
-
-void
-test01()
-{
-  using namespace std::literals::chrono_literals;
-
-  // std::numeric_limits<int64_t>::max() == 9223372036854775807;
-  auto h = 9223372036854775808h;
-  // { dg-error "cannot be represented" "" { target *-*-* } 894 }
-}
-// { dg-prune-output "in constexpr expansion" } // needed for -O0
diff --git a/libstdc++-v3/testsuite/20_util/duration/literals/range_neg.cc b/libstdc++-v3/testsuite/20_util/duration/literals/range_neg.cc
new file mode 100644 (file)
index 0000000..d1be744
--- /dev/null
@@ -0,0 +1,31 @@
+// { dg-do compile { target c++14 } }
+
+// Copyright (C) 2014-2018 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>
+
+void
+test01()
+{
+  using namespace std::literals::chrono_literals;
+
+  // std::numeric_limits<int64_t>::max() == 9223372036854775807;
+  auto h = 9223372036854775808h;
+  // { dg-error "cannot be represented" "" { target *-*-* } 898 }
+}
+// { dg-prune-output "in constexpr expansion" } // needed for -O0