blob: ff90f8a47c318c9af7d04f4bbd9bb9bf35de7992 [file] [log] [blame]
// { dg-do compile { target c++17 } }
#include <type_traits>
template<class T> struct A { using type = typename T::type; };
using invalid = A<void>;
// [meta.logical]/3: For a specialization conjunction<B_1, ..., B_n>, if
// there is a template type argument B_i for which bool(B_i::value) is false,
// then instantiating conjunction<B_1, ..., B_n>::value does not require the
// instantiation of B_j::value for j > i.
static_assert(!std::conjunction_v<std::false_type, invalid>);
static_assert(!std::conjunction_v<std::false_type, invalid, invalid>);
static_assert(!std::conjunction_v<std::true_type, std::false_type, invalid>);
static_assert(!std::conjunction_v<std::true_type, std::false_type, invalid, invalid>);
static_assert(!std::conjunction_v<std::false_type,
std::conjunction<invalid>,
std::disjunction<invalid>,
std::negation<invalid>>);
// [meta.logical]/8: For a specialization disjunction<B_1, ..., B_n>, if
// there is a template type argument B_i for which bool(B_i::value) is true,
// then instantiating disjunction<B_1, ..., B_n>::value does not require the
// instantiation of B_j::value for j > i.
static_assert(std::disjunction_v<std::true_type, invalid>);
static_assert(std::disjunction_v<std::true_type, invalid, invalid>);
static_assert(std::disjunction_v<std::false_type, std::true_type, invalid>);
static_assert(std::disjunction_v<std::false_type, std::true_type, invalid, invalid>);
static_assert(std::disjunction_v<std::true_type,
std::conjunction<invalid>,
std::disjunction<invalid>,
std::negation<invalid>>);
#if __GLIBCXX__
// Also test the corresponding internal traits __and_, __or_ and __not_.
static_assert(!std::__and_v<std::false_type, invalid>);
static_assert(!std::__and_v<std::false_type, invalid, invalid>);
static_assert(!std::__and_v<std::true_type, std::false_type, invalid>);
static_assert(!std::__and_v<std::true_type, std::false_type, invalid, invalid>);
static_assert(!std::__and_v<std::false_type,
std::__and_<invalid>,
std::__or_<invalid>,
std::__not_<invalid>>);
static_assert(std::__or_v<std::true_type, invalid>);
static_assert(std::__or_v<std::true_type, invalid, invalid>);
static_assert(std::__or_v<std::false_type, std::true_type, invalid>);
static_assert(std::__or_v<std::false_type, std::true_type, invalid, invalid>);
static_assert(std::__or_v<std::true_type,
std::__and_<invalid>,
std::__or_<invalid>,
std::__not_<invalid>>);
#endif