+2015-11-12 Ville Voutilainen <ville.voutilainen@gmail.com>
+
+ Implement D0013R2, logical type traits.
+
+ * g++.dg/cpp0x/Wattributes1.C: Adjust.
+
2015-11-12 Nathan Sidwell <nathan@codesourcery.com>
* c-c++-common/goacc/data-default-1.c: New.
#include <new>
__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 }
+2015-11-12 Ville Voutilainen <ville.voutilainen@gmail.com>
+
+ 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 <jwakely@redhat.com>
* include/experimental/bits/string_view.tcc: Fix doxygen @file.
constexpr bool is_detected_convertible_v
= is_detected_convertible<_To, _Op, _Args...>::value;
+#define __cpp_lib_experimental_logical_traits 201511
+
+template<typename... _Bn>
+ struct conjunction
+ : __and_<_Bn...>
+ { };
+
+template<typename... _Bn>
+ struct disjunction
+ : __or_<_Bn...>
+ { };
+
+template<typename _Pp>
+ struct negation
+ : __not_<_Pp>
+ { };
+
+template<typename... _Bn>
+ constexpr bool conjunction_v
+ = conjunction<_Bn...>::value;
+
+template<typename... _Bn>
+ constexpr bool disjunction_v
+ = disjunction<_Bn...>::value;
+
+template<typename _Pp>
+ constexpr bool negation_v
+ = negation<_Pp>::value;
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace fundamentals_v2
} // namespace experimental
: public integral_constant<bool, !_Pp::value>
{ };
+#if __cplusplus > 201402L
+
+#define __cpp_lib_logical_traits 201511
+
+ template<typename... _Bn>
+ struct conjunction
+ : __and_<_Bn...>
+ { };
+
+ template<typename... _Bn>
+ struct disjunction
+ : __or_<_Bn...>
+ { };
+
+ template<typename _Pp>
+ 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
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-error "static assertion failed" "" { target *-*-* } 2239 }
+// { dg-error "static assertion failed" "" { target *-*-* } 2259 }
#include <utility>
--- /dev/null
+// { 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
+// <http://www.gnu.org/licenses/>.
+
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+namespace std
+{
+ template struct conjunction<true_type, true_type>;
+ template struct disjunction<false_type, true_type>;
+ template struct negation<false_type>;
+}
--- /dev/null
+// { 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
+// <http://www.gnu.org/licenses/>.
+
+//
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+// { dg-do compile }
+
+void test01()
+{
+ // Check for required typedefs
+ typedef std::conjunction<std::true_type, std::true_type> 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<std::false_type, std::true_type> 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<std::false_type> 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;
+}
--- /dev/null
+// { 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
+// <http://www.gnu.org/licenses/>.
+
+#include <type_traits>
+
+void test01()
+{
+ static_assert(std::negation<std::false_type>{});
+ static_assert(!std::negation<std::true_type>{});
+ static_assert(std::conjunction<>{});
+ static_assert(!std::disjunction<>{});
+ static_assert(std::conjunction<std::true_type>{});
+ static_assert(!std::conjunction<std::false_type>{});
+ static_assert(std::disjunction<std::true_type>{});
+ static_assert(!std::disjunction<std::false_type>{});
+ static_assert(std::conjunction<std::true_type, std::true_type>{});
+ static_assert(!std::conjunction<std::true_type, std::false_type>{});
+ static_assert(std::disjunction<std::false_type, std::true_type>{});
+ static_assert(!std::disjunction<std::false_type, std::false_type>{});
+ static_assert(std::conjunction<std::true_type, std::true_type,
+ std::true_type>{});
+ static_assert(!std::conjunction<std::true_type, std::true_type,
+ std::false_type>{});
+ static_assert(std::disjunction<std::false_type, std::false_type,
+ std::true_type>{});
+ static_assert(!std::disjunction<std::false_type, std::false_type,
+ std::false_type>{});
+}
// { 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 }
// { 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 }
#include <experimental/type_traits>
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
&& is_convertible<int&, const int&>::value, "");
static_assert(!is_convertible_v<const int&, int&>
&& !is_convertible<const int&, int&>::value, "");
+
+static_assert(negation_v<false_type>);
+static_assert(!negation_v<true_type>);
+static_assert(conjunction_v<>);
+static_assert(!disjunction_v<>);
+static_assert(conjunction_v<true_type>);
+static_assert(!conjunction_v<false_type>);
+static_assert(disjunction_v<true_type>);
+static_assert(!disjunction_v<false_type>);
+static_assert(conjunction_v<true_type, true_type>);
+static_assert(!conjunction_v<true_type, false_type>);
+static_assert(disjunction_v<false_type, true_type>);
+static_assert(!disjunction_v<false_type, false_type>);
+static_assert(conjunction_v<true_type, true_type,
+ true_type>);
+static_assert(!conjunction_v<true_type, true_type,
+ false_type>);
+static_assert(disjunction_v<false_type, false_type,
+ true_type>);
+static_assert(!disjunction_v<false_type, false_type,
+ false_type>);