//===----------------------------------------------------------------------===// // // 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 disjunction; // C++17 // template // constexpr bool disjunction_v = disjunction::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 = -1; static constexpr auto MySpecial = 37; }; struct MySpecialFalseType { static constexpr auto value = false; static constexpr auto MySpecial = 23; }; struct MyOtherSpecialFalseType { static constexpr auto value = false; static constexpr auto MySpecial = 46; }; struct HasNoValue {}; struct ExplicitlyConvertibleToBool { explicit constexpr operator bool() const { return false; } }; struct ValueExplicitlyConvertible { static constexpr ExplicitlyConvertibleToBool 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::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, "" ); 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::disjunction::value); static_assert(std::disjunction_v); // Also check the case where HasNoValue is not the last in the list (https://llvm.org/PR584900). static_assert(std::disjunction::value); static_assert(std::disjunction_v); static_assert(std::disjunction::value); static_assert(std::disjunction_v); static_assert(std::disjunction::value == -1); static_assert(std::disjunction_v); static_assert(std::is_base_of_v>); static_assert(std::disjunction_v);