1a29a1a33SNikolas Klauser //===----------------------------------------------------------------------===//
2a29a1a33SNikolas Klauser //
3a29a1a33SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a29a1a33SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
5a29a1a33SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a29a1a33SNikolas Klauser //
7a29a1a33SNikolas Klauser //===----------------------------------------------------------------------===//
8a29a1a33SNikolas Klauser
9a29a1a33SNikolas Klauser // UNSUPPORTED: c++03, c++11, c++14
10a29a1a33SNikolas Klauser // type_traits
11a29a1a33SNikolas Klauser
12a29a1a33SNikolas Klauser // template<class... B> struct conjunction; // C++17
13a29a1a33SNikolas Klauser // template<class... B>
14a29a1a33SNikolas Klauser // constexpr bool conjunction_v = conjunction<B...>::value; // C++17
15a29a1a33SNikolas Klauser
16a29a1a33SNikolas Klauser #include <cassert>
17a29a1a33SNikolas Klauser #include <type_traits>
18a29a1a33SNikolas Klauser
19a29a1a33SNikolas Klauser #include "test_macros.h"
20a29a1a33SNikolas Klauser
21a29a1a33SNikolas Klauser struct True { static constexpr bool value = true; };
22a29a1a33SNikolas Klauser struct False { static constexpr bool value = false; };
23a29a1a33SNikolas Klauser
24a29a1a33SNikolas Klauser struct MySpecialTrueType { static constexpr auto value = true; static constexpr auto MySpecial = 23; };
25a29a1a33SNikolas Klauser struct MyOtherSpecialTrueType { static constexpr auto value = -1; static constexpr auto MySpecial = 46; };
26a29a1a33SNikolas Klauser struct MySpecialFalseType { static constexpr auto value = false; static constexpr auto MySpecial = 37; };
27a29a1a33SNikolas Klauser struct HasNoValue {};
operator boolExplicitlyConvertibleToBool28a29a1a33SNikolas Klauser struct ExplicitlyConvertibleToBool { explicit constexpr operator bool() const { return true; } };
29a29a1a33SNikolas Klauser struct ValueExplicitlyConvertible { static constexpr ExplicitlyConvertibleToBool value {}; };
30a29a1a33SNikolas Klauser
31a29a1a33SNikolas Klauser static_assert( std::conjunction<>::value);
32a29a1a33SNikolas Klauser static_assert( std::conjunction<std::true_type >::value);
33a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::false_type>::value);
34a29a1a33SNikolas Klauser
35a29a1a33SNikolas Klauser static_assert( std::conjunction_v<>);
36a29a1a33SNikolas Klauser static_assert( std::conjunction_v<std::true_type >);
37a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::false_type>);
38a29a1a33SNikolas Klauser
39a29a1a33SNikolas Klauser static_assert( std::conjunction<std::true_type, std::true_type >::value);
40a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::true_type, std::false_type>::value);
41a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::false_type, std::true_type >::value);
42a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::false_type, std::false_type>::value);
43a29a1a33SNikolas Klauser
44a29a1a33SNikolas Klauser static_assert( std::conjunction_v<std::true_type, std::true_type >);
45a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::true_type, std::false_type>);
46a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::false_type, std::true_type >);
47a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::false_type, std::false_type>);
48a29a1a33SNikolas Klauser
49a29a1a33SNikolas Klauser static_assert( std::conjunction<std::true_type, std::true_type, std::true_type >::value);
50a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::true_type, std::false_type, std::true_type >::value);
51a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::false_type, std::true_type, std::true_type >::value);
52a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::false_type, std::false_type, std::true_type >::value);
53a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::true_type, std::true_type, std::false_type>::value);
54a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::true_type, std::false_type, std::false_type>::value);
55a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::false_type, std::true_type, std::false_type>::value);
56a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::false_type, std::false_type, std::false_type>::value);
57a29a1a33SNikolas Klauser
58a29a1a33SNikolas Klauser static_assert( std::conjunction_v<std::true_type, std::true_type, std::true_type >);
59a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::true_type, std::false_type, std::true_type >);
60a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::false_type, std::true_type, std::true_type >);
61a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::false_type, std::false_type, std::true_type >);
62a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::true_type, std::true_type, std::false_type>);
63a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::true_type, std::false_type, std::false_type>);
64a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::false_type, std::true_type, std::false_type>);
65a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::false_type, std::false_type, std::false_type>);
66a29a1a33SNikolas Klauser
67a29a1a33SNikolas Klauser static_assert( std::conjunction<True >::value);
68a29a1a33SNikolas Klauser static_assert(!std::conjunction<False>::value);
69a29a1a33SNikolas Klauser
70a29a1a33SNikolas Klauser static_assert( std::conjunction_v<True >);
71a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<False>);
72a29a1a33SNikolas Klauser
73a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<MySpecialTrueType, std::conjunction<MyOtherSpecialTrueType, MySpecialTrueType>>);
74a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<MyOtherSpecialTrueType, std::conjunction<MySpecialTrueType, MyOtherSpecialTrueType>>);
75a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<MySpecialFalseType, std::conjunction<MySpecialFalseType, MyOtherSpecialTrueType>>);
76a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<MySpecialFalseType, std::conjunction<MyOtherSpecialTrueType, MySpecialFalseType>>);
77a29a1a33SNikolas Klauser
78a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<std::false_type, std::conjunction<std::false_type, HasNoValue>>);
79a29a1a33SNikolas Klauser
80a29a1a33SNikolas Klauser static_assert(!std::conjunction<std::false_type, HasNoValue>::value);
81a29a1a33SNikolas Klauser static_assert(!std::conjunction_v<std::false_type, HasNoValue>);
82a29a1a33SNikolas Klauser
83*a0549ee2SAaron Jacobs // Also check the case where HasNoValue is not the last in the list (https://llvm.org/PR584900).
84*a0549ee2SAaron Jacobs static_assert(!std::conjunction<std::false_type, HasNoValue, std::true_type>::value);
85*a0549ee2SAaron Jacobs static_assert(!std::conjunction_v<std::false_type, HasNoValue, std::true_type>);
86*a0549ee2SAaron Jacobs
87*a0549ee2SAaron Jacobs static_assert(!std::conjunction<std::false_type, HasNoValue, std::false_type>::value);
88*a0549ee2SAaron Jacobs static_assert(!std::conjunction_v<std::false_type, HasNoValue, std::false_type>);
89*a0549ee2SAaron Jacobs
90a29a1a33SNikolas Klauser static_assert(std::conjunction<MyOtherSpecialTrueType>::value == -1);
91a29a1a33SNikolas Klauser static_assert(std::conjunction_v<MyOtherSpecialTrueType>);
92a29a1a33SNikolas Klauser
93a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<ValueExplicitlyConvertible, std::conjunction<ValueExplicitlyConvertible>>);
94a29a1a33SNikolas Klauser static_assert(std::conjunction_v<ValueExplicitlyConvertible, std::true_type>);
95