From: Jonathan Wakely Date: Mon, 18 Jun 2018 18:02:24 +0000 (+0100) Subject: LWG 3050 Fix cv-qualification of convertibility constraints X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8499a82c19c6e2d165bd1c5ff67b8f0e9294190e;p=gcc.git LWG 3050 Fix cv-qualification of convertibility constraints 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 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0af7c93227e..bdf20606bc9 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2018-06-18 Jonathan Wakely + + 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 * crossconfig.m4: Handle OpenBSD just like NetBSD. 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, + is_convertible, __or_<__is_float, __not_<__is_float<_Rep2>>>>> constexpr explicit duration(const _Rep2& __rep) : __r(static_cast(__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::type> - using __common_rep_t - = typename enable_if::value, _CRep>::type; + using __common_rep_t = typename + enable_if::value, _CRep>::type; template 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 +// . + +// { dg-do compile { target c++11 } } + +#include + +struct X { operator int64_t() /* not const */; }; +static_assert(!std::is_constructible::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 index a1706d35506..00000000000 --- a/libstdc++-v3/testsuite/20_util/duration/literals/range.cc +++ /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 -// . - -#include - -void -test01() -{ - using namespace std::literals::chrono_literals; - - // std::numeric_limits::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 index 00000000000..d1be74493c9 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/duration/literals/range_neg.cc @@ -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 +// . + +#include + +void +test01() +{ + using namespace std::literals::chrono_literals; + + // std::numeric_limits::max() == 9223372036854775807; + auto h = 9223372036854775808h; + // { dg-error "cannot be represented" "" { target *-*-* } 898 } +} +// { dg-prune-output "in constexpr expansion" } // needed for -O0