Message ID | 20180618180056.GA4180@redhat.com |
---|---|
State | New |
Headers | show |
Series | LWG 3050 Fix cv-qualification of convertibility constraints | expand |
On 18/06/18 19:00 +0100, Jonathan Wakely wrote: >This issue hasn't been voted into the working draft yet, but it's been >approved by LWG and is obviously correct. > > * 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. I forgot to 'git add' this new test. Here it is. Tested x86_64-linux, committed to trunk. commit 89ea69b95205a1cfadee6599f2168bc077f57fb7 Author: Jonathan Wakely <jwakely@redhat.com> Date: Tue Jun 19 22:06:56 2018 +0100 Add testcase accidentally not committed earlier * testsuite/20_util/duration/arithmetic/dr3050.cc: Add new test missed from recent commit. diff --git a/libstdc++-v3/testsuite/20_util/duration/arithmetic/dr3050.cc b/libstdc++-v3/testsuite/20_util/duration/arithmetic/dr3050.cc new file mode 100644 index 00000000000..a2d26620466 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/duration/arithmetic/dr3050.cc @@ -0,0 +1,30 @@ +// 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 */; }; + +void test01(std::chrono::seconds s, X x) +{ + s * x; // { dg-error "no match" } + x * s; // { dg-error "no match" } + s / x; // { dg-error "no match" } + s % x; // { dg-error "no match" } +}
diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono index b3a0cb2087d..d6d9dcae411 100644 --- a/libstdc++-v3/include/std/chrono +++ b/libstdc++-v3/include/std/chrono @@ -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 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 similarity index 94% rename from libstdc++-v3/testsuite/20_util/duration/literals/range.cc rename to libstdc++-v3/testsuite/20_util/duration/literals/range_neg.cc