//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 // type_traits // template struct conjunction; // C++17 // template // constexpr bool conjunction_v = conjunction::value; // C++17 #include #include #include "test_macros.h" struct True { static constexpr bool value = true; }; struct False { static constexpr bool value = false; }; struct MySpecialTrueType { static constexpr auto value = true; static constexpr auto MySpecial = 23; }; struct MyOtherSpecialTrueType { static constexpr auto value = -1; static constexpr auto MySpecial = 46; }; struct MySpecialFalseType { static constexpr auto value = false; static constexpr auto MySpecial = 37; }; struct HasNoValue {}; struct ExplicitlyConvertibleToBool { explicit constexpr operator bool() const { return true; } }; struct ValueExplicitlyConvertible { static constexpr ExplicitlyConvertibleToBool 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::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); static_assert(std::is_base_of_v>); static_assert(std::is_base_of_v>); static_assert(std::is_base_of_v>); static_assert(std::is_base_of_v>); static_assert(std::is_base_of_v>); static_assert(!std::conjunction::value); static_assert(!std::conjunction_v); // Also check the case where HasNoValue is not the last in the list (https://llvm.org/PR584900). static_assert(!std::conjunction::value); static_assert(!std::conjunction_v); static_assert(!std::conjunction::value); static_assert(!std::conjunction_v); static_assert(std::conjunction::value == -1); static_assert(std::conjunction_v); static_assert(std::is_base_of_v>); static_assert(std::conjunction_v);