diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-07-04 13:59:51 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2018-07-04 13:59:51 +0000 |
commit | eff75260a5c4a153551b8a21c84a3729717d8ee3 (patch) | |
tree | 71231d2fd9e493387a2fac44a111f802410a2b57 | |
parent | e44a6b6bcf2b8afd6d1d335cf48bb3116b57985e (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/ChangeLog | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/std/chrono | 10 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/duration/cons/dr3050.cc | 24 | ||||
-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 |