From c3a6648b1ca4359c5097f625bc6db6409b31f693 Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Thu, 12 Nov 2015 15:56:31 +0200 Subject: [PATCH] Implement D0013R2, logical type traits. 2015-11-12 Ville Voutilainen Implement D0013R2, logical type traits. /libstdc++-v3 * include/experimental/type_traits (conjunction_v, disjunction_v, negation_v): New. * include/std/type_traits (conjunction, disjunction, negation): Likewise. * testsuite/20_util/declval/requirements/1_neg.cc: Adjust. * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Likewise. * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise. * testsuite/experimental/type_traits/value.cc: Likewise. * testsuite/20_util/logical_traits/requirements/explicit_instantiation.cc: New. * testsuite/20_util/logical_traits/requirements/typedefs.cc: Likewise. * testsuite/20_util/logical_traits/value.cc: Likewise. /testsuite * g++.dg/cpp0x/Wattributes1.C: Adjust. From-SVN: r230258 --- gcc/testsuite/ChangeLog | 6 ++ gcc/testsuite/g++.dg/cpp0x/Wattributes1.C | 2 +- libstdc++-v3/ChangeLog | 17 ++++++ libstdc++-v3/include/experimental/type_traits | 29 ++++++++++ libstdc++-v3/include/std/type_traits | 20 +++++++ .../20_util/declval/requirements/1_neg.cc | 2 +- .../requirements/explicit_instantiation.cc | 30 ++++++++++ .../logical_traits/requirements/typedefs.cc | 55 +++++++++++++++++++ .../testsuite/20_util/logical_traits/value.cc | 45 +++++++++++++++ .../make_signed/requirements/typedefs_neg.cc | 2 +- .../requirements/typedefs_neg.cc | 4 +- .../experimental/type_traits/value.cc | 23 +++++++- 12 files changed, 229 insertions(+), 6 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/logical_traits/requirements/explicit_instantiation.cc create mode 100644 libstdc++-v3/testsuite/20_util/logical_traits/requirements/typedefs.cc create mode 100644 libstdc++-v3/testsuite/20_util/logical_traits/value.cc diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a7395cf4f37..ace9cfd5234 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-11-12 Ville Voutilainen + + Implement D0013R2, logical type traits. + + * g++.dg/cpp0x/Wattributes1.C: Adjust. + 2015-11-12 Nathan Sidwell * c-c++-common/goacc/data-default-1.c: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/Wattributes1.C b/gcc/testsuite/g++.dg/cpp0x/Wattributes1.C index d81885152c5..dd9011b8870 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/ChangeLog b/libstdc++-v3/ChangeLog index 00aa89fbef1..178ae253a8d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,20 @@ +2015-11-12 Ville Voutilainen + + Implement D0013R2, logical type traits. + + * include/experimental/type_traits (conjunction, disjunction, + negation, conjunction_v, disjunction_v, negation_v): New. + * include/std/type_traits (conjunction, disjunction, negation): + Likewise. + * testsuite/20_util/declval/requirements/1_neg.cc: Adjust. + * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Likewise. + * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: + Likewise. + * testsuite/experimental/type_traits/value.cc: Likewise. + * testsuite/20_util/logical_traits/requirements/explicit_instantiation.cc: New. + * testsuite/20_util/logical_traits/requirements/typedefs.cc: Likewise. + * testsuite/20_util/logical_traits/value.cc: Likewise. + 2015-11-12 Jonathan Wakely * include/experimental/bits/string_view.tcc: Fix doxygen @file. diff --git a/libstdc++-v3/include/experimental/type_traits b/libstdc++-v3/include/experimental/type_traits index b0ed3b0fa66..e4f3ffef004 100644 --- a/libstdc++-v3/include/experimental/type_traits +++ b/libstdc++-v3/include/experimental/type_traits @@ -271,6 +271,35 @@ template class _Op, typename... _Args> constexpr bool is_detected_convertible_v = is_detected_convertible<_To, _Op, _Args...>::value; +#define __cpp_lib_experimental_logical_traits 201511 + +template + struct conjunction + : __and_<_Bn...> + { }; + +template + struct disjunction + : __or_<_Bn...> + { }; + +template + struct negation + : __not_<_Pp> + { }; + +template + constexpr bool conjunction_v + = conjunction<_Bn...>::value; + +template + constexpr bool disjunction_v + = disjunction<_Bn...>::value; + +template + constexpr bool negation_v + = negation<_Pp>::value; + _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 7448d5b836f..e5102def906 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 4e7deda4a20..37bc6b10da6 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 00000000000..b2b6c71e6cf --- /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 00000000000..ea102f87206 --- /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 00000000000..1da95a3e49d --- /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 8e5fe532f34..9fbd95b2760 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 4cd03115c26..8060aeec854 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 fefe52391a2..d52b454fa69 100644 --- a/libstdc++-v3/testsuite/experimental/type_traits/value.cc +++ b/libstdc++-v3/testsuite/experimental/type_traits/value.cc @@ -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); -- 2.30.2