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 }