From 2a8f244b91a85cb8c8ae4f728b56c739f5dd5a80 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 1 Dec 2017 17:12:23 +0000 Subject: [PATCH] PR libstdc++/83134 Ensure std::__not_ converts B::value to bool Backport from mainline 2017-11-23 Jonathan Wakely PR libstdc++/83134 * include/std/type_traits (__not_): Explicitly convert to bool. * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error. * testsuite/20_util/logical_traits/83134.cc: New test. * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust dg-error. * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise. From-SVN: r255329 --- libstdc++-v3/ChangeLog | 12 +++++++ libstdc++-v3/include/std/type_traits | 15 ++++----- .../20_util/declval/requirements/1_neg.cc | 2 +- .../testsuite/20_util/logical_traits/83134.cc | 32 +++++++++++++++++++ .../make_signed/requirements/typedefs_neg.cc | 2 +- .../requirements/typedefs_neg.cc | 4 +-- 6 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/logical_traits/83134.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f51b81a5dab..f001b9a9111 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,17 @@ 2017-12-01 Jonathan Wakely + Backport from mainline + 2017-11-23 Jonathan Wakely + + PR libstdc++/83134 + * include/std/type_traits (__not_): Explicitly convert to bool. + * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error. + * testsuite/20_util/logical_traits/83134.cc: New test. + * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust + dg-error. + * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: + Likewise. + Backport from mainline 2017-12-01 Jonathan Wakely diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 098685739b2..096429dc058 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -151,10 +151,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct __not_ - : public integral_constant + : public __bool_constant { }; -#if __cplusplus > 201402L +#if __cplusplus >= 201703L #define __cpp_lib_logical_traits 201510 @@ -174,18 +174,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { }; template - inline constexpr bool conjunction_v - = conjunction<_Bn...>::value; + inline constexpr bool conjunction_v = conjunction<_Bn...>::value; template - inline constexpr bool disjunction_v - = disjunction<_Bn...>::value; + inline constexpr bool disjunction_v = disjunction<_Bn...>::value; template - inline constexpr bool negation_v - = negation<_Pp>::value; + inline constexpr bool negation_v = negation<_Pp>::value; -#endif +#endif // C++17 // For several sfinae-friendly trait implementations we transport both the // result information (as the member type) and the failure information (no diff --git a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc index dc9daeb42ce..bc12719071e 100644 --- a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc +++ b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc @@ -18,7 +18,7 @@ // with this library; see the file COPYING3. If not see // . -// { dg-error "static assertion failed" "" { target *-*-* } 2259 } +// { dg-error "declval.. must not be used" "" { target *-*-* } 0 } #include diff --git a/libstdc++-v3/testsuite/20_util/logical_traits/83134.cc b/libstdc++-v3/testsuite/20_util/logical_traits/83134.cc new file mode 100644 index 00000000000..06f45da3b01 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/logical_traits/83134.cc @@ -0,0 +1,32 @@ +// Copyright (C) 2017 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-options "-std=gnu++17" } +// { dg-do compile { target c++1z } } + +#include + +struct X { + constexpr operator bool() const { return false; } + constexpr bool operator!() const = delete; +}; + +struct Y { + static constexpr X value{}; +}; + +static_assert(std::negation::value); // PR libstdc++/83134 diff --git a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc index 664fb70fb4b..6d10e606cde 100644 --- a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc +++ b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc @@ -47,4 +47,4 @@ void test01() // { dg-error "required from here" "" { target *-*-* } 39 } // { dg-error "required from here" "" { target *-*-* } 41 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1924 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1921 } diff --git a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc index 6d6471755f7..4ab6880a346 100644 --- a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc +++ b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc @@ -47,5 +47,5 @@ void test01() // { dg-error "required from here" "" { target *-*-* } 39 } // { dg-error "required from here" "" { target *-*-* } 41 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1820 } -// { dg-error "declaration of" "" { target *-*-* } 1777 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1817 } +// { dg-error "declaration of" "" { target *-*-* } 1774 }