diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2017-11-23 21:35:27 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2017-11-23 21:35:27 +0000 |
commit | 4b9840f230d4f8f4964639f776073821672fb1a7 (patch) | |
tree | 8c885cca19a17baaaff518cf8b097d432a01acf1 /libstdc++-v3 | |
parent | de8603793a901cb44118567fb3b4fd8e39687e8b (diff) | |
download | gcc-4b9840f230d4f8f4964639f776073821672fb1a7.zip gcc-4b9840f230d4f8f4964639f776073821672fb1a7.tar.gz gcc-4b9840f230d4f8f4964639f776073821672fb1a7.tar.bz2 |
PR libstdc++/83134 Ensure std::__not_ converts B::value to bool
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: r255122
Diffstat (limited to 'libstdc++-v3')
6 files changed, 52 insertions, 12 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c17581b..099881a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2017-11-23 Jonathan Wakely <jwakely@redhat.com> + + 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. + 2017-11-22 Jonathan Wakely <jwakely@redhat.com> PR go/83102 diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 7eca08c..723c137 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -151,10 +151,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Pp> struct __not_ - : public integral_constant<bool, !_Pp::value> + : public __bool_constant<!bool(_Pp::value)> { }; -#if __cplusplus > 201402L +#if __cplusplus >= 201703L #define __cpp_lib_logical_traits 201510 @@ -174,18 +174,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { }; template<typename... _Bn> - inline constexpr bool conjunction_v - = conjunction<_Bn...>::value; + inline constexpr bool conjunction_v = conjunction<_Bn...>::value; template<typename... _Bn> - inline constexpr bool disjunction_v - = disjunction<_Bn...>::value; + inline constexpr bool disjunction_v = disjunction<_Bn...>::value; template<typename _Pp> - 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 17b41a0..bc12719 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 // <http://www.gnu.org/licenses/>. -// { dg-error "static assertion failed" "" { target *-*-* } 2093 } +// { dg-error "declval.. must not be used" "" { target *-*-* } 0 } #include <utility> 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 0000000..3595e64 --- /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 +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include <type_traits> + +struct X { + constexpr operator bool() const { return false; } + constexpr bool operator!() const = delete; +}; + +struct Y { + static constexpr X value{}; +}; + +static_assert(std::negation<Y>::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 3081553..05bef35 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 *-*-* } 1760 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1757 } 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 412608e..25240a2 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 *-*-* } 1656 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1653 } |