From dd1b261f3a63bf287f01ac3628affeedce77663a Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Mon, 16 Nov 2015 15:54:13 +0000 Subject: Implement P0013R1: Logical Operator Type Traits. Make a hidden implementation (__and_, __or_, and __not_) so that we can use them elsewhere in non-C++17 code - for example, in the LFTS llvm-svn: 253215 --- .../meta/meta.logical/conjunction.pass.cpp | 66 ++++++++++++++++++++++ .../meta/meta.logical/disjunction.pass.cpp | 66 ++++++++++++++++++++++ .../utilities/meta/meta.logical/negation.pass.cpp | 39 +++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 libcxx/test/std/utilities/meta/meta.logical/conjunction.pass.cpp create mode 100644 libcxx/test/std/utilities/meta/meta.logical/disjunction.pass.cpp create mode 100644 libcxx/test/std/utilities/meta/meta.logical/negation.pass.cpp (limited to 'libcxx/test/std/utilities/meta') diff --git a/libcxx/test/std/utilities/meta/meta.logical/conjunction.pass.cpp b/libcxx/test/std/utilities/meta/meta.logical/conjunction.pass.cpp new file mode 100644 index 00000000000..dce58ec2372 --- /dev/null +++ b/libcxx/test/std/utilities/meta/meta.logical/conjunction.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// type_traits + +// template struct conjunction; // C++17 +// template +// constexpr bool conjunction_v = conjunction::value; // C++17 + +#include +#include + +struct True { static constexpr bool value = true; }; +struct False { static constexpr bool value = false; }; + +int main() +{ + static_assert ( std::conjunction<>::value, "" ); + static_assert ( std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + + static_assert ( std::conjunction_v<>, "" ); + static_assert ( std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + + static_assert ( std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + + static_assert ( std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + + static_assert ( std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + + static_assert ( std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); + + static_assert ( std::conjunction::value, "" ); + static_assert (!std::conjunction::value, "" ); + + static_assert ( std::conjunction_v, "" ); + static_assert (!std::conjunction_v, "" ); +} diff --git a/libcxx/test/std/utilities/meta/meta.logical/disjunction.pass.cpp b/libcxx/test/std/utilities/meta/meta.logical/disjunction.pass.cpp new file mode 100644 index 00000000000..13cd9341b99 --- /dev/null +++ b/libcxx/test/std/utilities/meta/meta.logical/disjunction.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// type_traits + +// template struct disjunction; // C++17 +// template +// constexpr bool disjunction_v = disjunction::value; // C++17 + +#include +#include + +struct True { static constexpr bool value = true; }; +struct False { static constexpr bool value = false; }; + +int main() +{ + static_assert (!std::disjunction<>::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert (!std::disjunction::value, "" ); + + static_assert (!std::disjunction_v<>, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert (!std::disjunction_v, "" ); + + static_assert ( std::disjunction::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert (!std::disjunction::value, "" ); + + static_assert ( std::disjunction_v, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert (!std::disjunction_v, "" ); + + static_assert ( std::disjunction::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert ( std::disjunction::value, "" ); + static_assert (!std::disjunction::value, "" ); + + static_assert ( std::disjunction_v, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert ( std::disjunction_v, "" ); + static_assert (!std::disjunction_v, "" ); + + static_assert ( std::disjunction::value, "" ); + static_assert (!std::disjunction::value, "" ); + + static_assert ( std::disjunction_v, "" ); + static_assert (!std::disjunction_v, "" ); +} diff --git a/libcxx/test/std/utilities/meta/meta.logical/negation.pass.cpp b/libcxx/test/std/utilities/meta/meta.logical/negation.pass.cpp new file mode 100644 index 00000000000..76ff6c5b24d --- /dev/null +++ b/libcxx/test/std/utilities/meta/meta.logical/negation.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// type_traits + +// template struct negation; // C++17 +// template +// constexpr bool negation_v = negation::value; // C++17 + +#include +#include + +struct True { static constexpr bool value = true; }; +struct False { static constexpr bool value = false; }; + +int main() +{ + static_assert (!std::negation::value, "" ); + static_assert ( std::negation::value, "" ); + + static_assert (!std::negation_v, "" ); + static_assert ( std::negation_v, "" ); + + static_assert (!std::negation::value, "" ); + static_assert ( std::negation::value, "" ); + + static_assert (!std::negation_v, "" ); + static_assert ( std::negation_v, "" ); + + static_assert ( std::negation>::value, "" ); + static_assert (!std::negation>::value, "" ); +} -- cgit v1.2.3