diff --git a/gcc/testsuite/g++.dg/cpp0x/Wattributes1.C b/gcc/testsuite/g++.dg/cpp0x/Wattributes1.C index d818851..dd9011b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/Wattributes1.C +++ b/gcc/testsuite/g++.dg/cpp0x/Wattributes1.C @@ -5,4 +5,4 @@ #include __attribute__((visibility("hidden")))void*operator new(std::size_t); // { dg-warning "visibility attribute ignored" } -// { dg-message "previous declaration" "" { target *-*-* } 111 } +// { dg-message "previous declaration" "" { target *-*-* } 116 } diff --git a/libstdc++-v3/include/experimental/type_traits b/libstdc++-v3/include/experimental/type_traits index b0ed3b0..b7f3bda 100644 --- a/libstdc++-v3/include/experimental/type_traits +++ b/libstdc++-v3/include/experimental/type_traits @@ -271,6 +271,28 @@ template class _Op, typename... _Args> constexpr bool is_detected_convertible_v = is_detected_convertible<_To, _Op, _Args...>::value; +#if __cplusplus > 201402L + +#define __cpp_lib_experimental_logical_traits 201511 + +using std::conjunction; +using std::disjunction; +using std::negation; + +template + constexpr bool conjunction_v + = conjunction<_Bn...>::value; + +template + constexpr bool disjunction_v + = disjunction<_Bn...>::value; + +template + constexpr bool negation_v + = negation<_Pp>::value; + +#endif + _GLIBCXX_END_NAMESPACE_VERSION } // namespace fundamentals_v2 } // namespace experimental diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 7448d5b..e5102de 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -154,6 +154,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : public integral_constant { }; +#if __cplusplus > 201402L + +#define __cpp_lib_logical_traits 201511 + + template + struct conjunction + : __and_<_Bn...> + { }; + + template + struct disjunction + : __or_<_Bn...> + { }; + + template + struct negation + : __not_<_Pp> + { }; +#endif + // For several sfinae-friendly trait implementations we transport both the // result information (as the member type) and the failure information (no // member type). This is very similar to std::enable_if, but we cannot use 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 4e7deda..37bc6b1 100644 --- a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc +++ b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc @@ -19,7 +19,7 @@ // with this library; see the file COPYING3. If not see // . -// { dg-error "static assertion failed" "" { target *-*-* } 2239 } +// { dg-error "static assertion failed" "" { target *-*-* } 2259 } #include diff --git a/libstdc++-v3/testsuite/20_util/logical_traits/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/logical_traits/requirements/explicit_instantiation.cc new file mode 100644 index 0000000..b2b6c71 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/logical_traits/requirements/explicit_instantiation.cc @@ -0,0 +1,30 @@ +// { dg-options "-std=gnu++17" } +// { dg-do compile } + +// Copyright (C) 2015 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 +// . + +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include + +namespace std +{ + template struct conjunction; + template struct disjunction; + template struct negation; +} diff --git a/libstdc++-v3/testsuite/20_util/logical_traits/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/logical_traits/requirements/typedefs.cc new file mode 100644 index 0000000..ea102f8 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/logical_traits/requirements/typedefs.cc @@ -0,0 +1,55 @@ +// { dg-options "-std=gnu++17" } +// +// Copyright (C) 2015 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 +// . + +// +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include + +// { dg-do compile } + +void test01() +{ + // Check for required typedefs + typedef std::conjunction test_type; + typedef test_type::value_type value_type; + typedef test_type::type type; + typedef test_type::type::value_type type_value_type; + typedef test_type::type::type type_type; +} + +void test02() +{ + // Check for required typedefs + typedef std::disjunction test_type; + typedef test_type::value_type value_type; + typedef test_type::type type; + typedef test_type::type::value_type type_value_type; + typedef test_type::type::type type_type; +} + +void test03() +{ + // Check for required typedefs + typedef std::negation test_type; + typedef test_type::value_type value_type; + typedef test_type::type type; + typedef test_type::type::value_type type_value_type; + typedef test_type::type::type type_type; +} diff --git a/libstdc++-v3/testsuite/20_util/logical_traits/value.cc b/libstdc++-v3/testsuite/20_util/logical_traits/value.cc new file mode 100644 index 0000000..1da95a3 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/logical_traits/value.cc @@ -0,0 +1,45 @@ +// { dg-options "-std=gnu++17" } +// { dg-do compile } +// +// Copyright (C) 2015 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() +{ + static_assert(std::negation{}); + static_assert(!std::negation{}); + static_assert(std::conjunction<>{}); + static_assert(!std::disjunction<>{}); + static_assert(std::conjunction{}); + static_assert(!std::conjunction{}); + static_assert(std::disjunction{}); + static_assert(!std::disjunction{}); + static_assert(std::conjunction{}); + static_assert(!std::conjunction{}); + static_assert(std::disjunction{}); + static_assert(!std::disjunction{}); + static_assert(std::conjunction{}); + static_assert(!std::conjunction{}); + static_assert(std::disjunction{}); + static_assert(!std::disjunction{}); +} 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 8e5fe53..9fbd95b 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 @@ -48,4 +48,4 @@ void test01() // { dg-error "required from here" "" { target *-*-* } 40 } // { dg-error "required from here" "" { target *-*-* } 42 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1904 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1924 } 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 4cd0311..8060aee 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 @@ -48,5 +48,5 @@ void test01() // { dg-error "required from here" "" { target *-*-* } 40 } // { dg-error "required from here" "" { target *-*-* } 42 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1800 } -// { dg-error "declaration of" "" { target *-*-* } 1757 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1820 } +// { dg-error "declaration of" "" { target *-*-* } 1777 } diff --git a/libstdc++-v3/testsuite/experimental/type_traits/value.cc b/libstdc++-v3/testsuite/experimental/type_traits/value.cc index fefe523..46ee2e4 100644 --- a/libstdc++-v3/testsuite/experimental/type_traits/value.cc +++ b/libstdc++-v3/testsuite/experimental/type_traits/value.cc @@ -1,4 +1,4 @@ -// { dg-options "-std=gnu++14" } +// { dg-options "-std=gnu++17" } // { dg-do compile } // Copyright (C) 2014-2015 Free Software Foundation, Inc. @@ -21,7 +21,7 @@ #include using namespace std; -using namespace std::experimental; +using namespace experimental; // These tests are rather simple, the front-end tests already test // variable templates, and the library tests for the underlying @@ -322,3 +322,24 @@ static_assert(is_convertible_v && is_convertible::value, ""); static_assert(!is_convertible_v && !is_convertible::value, ""); + +static_assert(negation_v); +static_assert(!negation_v); +static_assert(conjunction_v<>); +static_assert(!disjunction_v<>); +static_assert(conjunction_v); +static_assert(!conjunction_v); +static_assert(disjunction_v); +static_assert(!disjunction_v); +static_assert(conjunction_v); +static_assert(!conjunction_v); +static_assert(disjunction_v); +static_assert(!disjunction_v); +static_assert(conjunction_v); +static_assert(!conjunction_v); +static_assert(disjunction_v); +static_assert(!disjunction_v);