aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-07-04 13:59:51 +0000
committerJonathan Wakely <jwakely@redhat.com>2018-07-04 13:59:51 +0000
commiteff75260a5c4a153551b8a21c84a3729717d8ee3 (patch)
tree71231d2fd9e493387a2fac44a111f802410a2b57
parente44a6b6bcf2b8afd6d1d335cf48bb3116b57985e (diff)
LWG 3050 Fix cv-qualification of convertibility constraints
Backport from mainline 2018-06-18 Jonathan Wakely <jwakely@redhat.com> * 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. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@262412 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog12
-rw-r--r--libstdc++-v3/include/std/chrono10
-rw-r--r--libstdc++-v3/testsuite/20_util/duration/cons/dr3050.cc24
-rw-r--r--libstdc++-v3/testsuite/20_util/duration/literals/range_neg.cc (renamed from libstdc++-v3/testsuite/20_util/duration/literals/range.cc)2
4 files changed, 45 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 772c62fce40..c0b4c5fccba 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,6 +1,18 @@
2018-07-04 Jonathan Wakely <jwakely@redhat.com>
Backport from mainline
+ 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.
+
+ Backport from mainline
2018-06-13 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/86127
diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono
index 5d0151857e7..2138ff027e4 100644
--- a/libstdc++-v3/include/std/chrono
+++ b/libstdc++-v3/include/std/chrono
@@ -318,8 +318,10 @@ _GLIBCXX_END_NAMESPACE_VERSION
// constexpr copy constructor will be ill-formed.
duration(const duration&) = default;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 3050. Conversion specification problem in chrono::duration
template<typename _Rep2, typename = typename
- enable_if<is_convertible<_Rep2, rep>::value
+ enable_if<is_convertible<const _Rep2&, rep>::value
&& (treat_as_floating_point<rep>::value
|| !treat_as_floating_point<_Rep2>::value)>::type>
constexpr explicit duration(const _Rep2& __rep)
@@ -463,8 +465,12 @@ _GLIBCXX_END_NAMESPACE_VERSION
return __cd(__cd(__lhs).count() - __cd(__rhs).count());
}
+ // 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, bool =
- is_convertible<_Rep2,
+ is_convertible<const _Rep2&,
typename common_type<_Rep1, _Rep2>::type>::value>
struct __common_rep_type { };
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
index 00000000000..a4f57a38c30
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/duration/cons/dr3050.cc
@@ -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_neg.cc
index 531b53c42ec..bccff767ef7 100644
--- a/libstdc++-v3/testsuite/20_util/duration/literals/range.cc
+++ b/libstdc++-v3/testsuite/20_util/duration/literals/range_neg.cc
@@ -26,6 +26,6 @@ test01()
// std::numeric_limits<int64_t>::max() == 9223372036854775807;
auto h = 9223372036854775808h;
- // { dg-error "cannot be represented" "" { target *-*-* } 893 }
+ // { dg-error "cannot be represented" "" { target *-*-* } 899 }
}
// { dg-prune-output "in constexpr expansion" } // needed for -O0