xref: /llvm-project/libcxx/test/std/utilities/meta/meta.logical/disjunction.compile.pass.cpp (revision a0549ee2a39013c6ff75b86cda9d4ccfadb0ab88)
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 disjunction;                           // C++17
13a29a1a33SNikolas Klauser // template<class... B>
14a29a1a33SNikolas Klauser //   constexpr bool disjunction_v = disjunction<B...>::value;         // C++17
15a29a1a33SNikolas Klauser 
16a29a1a33SNikolas Klauser #include <type_traits>
17a29a1a33SNikolas Klauser #include <cassert>
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 = -1; static constexpr auto MySpecial = 37; };
25a29a1a33SNikolas Klauser struct MySpecialFalseType { static constexpr auto value = false; static constexpr auto MySpecial = 23; };
26a29a1a33SNikolas Klauser struct MyOtherSpecialFalseType { static constexpr auto value = false; static constexpr auto MySpecial = 46; };
27a29a1a33SNikolas Klauser struct HasNoValue {};
operator boolExplicitlyConvertibleToBool28a29a1a33SNikolas Klauser struct ExplicitlyConvertibleToBool { explicit constexpr operator bool() const { return false; } };
29a29a1a33SNikolas Klauser struct ValueExplicitlyConvertible { static constexpr ExplicitlyConvertibleToBool value {}; };
30a29a1a33SNikolas Klauser 
31a29a1a33SNikolas Klauser static_assert(!std::disjunction<>::value);
32a29a1a33SNikolas Klauser static_assert( std::disjunction<std::true_type >::value);
33a29a1a33SNikolas Klauser static_assert(!std::disjunction<std::false_type>::value);
34a29a1a33SNikolas Klauser 
35a29a1a33SNikolas Klauser static_assert(!std::disjunction_v<>);
36a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::true_type >);
37a29a1a33SNikolas Klauser static_assert(!std::disjunction_v<std::false_type>);
38a29a1a33SNikolas Klauser 
39a29a1a33SNikolas Klauser static_assert( std::disjunction<std::true_type,  std::true_type >::value);
40a29a1a33SNikolas Klauser static_assert( std::disjunction<std::true_type,  std::false_type>::value);
41a29a1a33SNikolas Klauser static_assert( std::disjunction<std::false_type, std::true_type >::value);
42a29a1a33SNikolas Klauser static_assert(!std::disjunction<std::false_type, std::false_type>::value);
43a29a1a33SNikolas Klauser 
44a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::true_type,  std::true_type >);
45a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::true_type,  std::false_type>);
46a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::false_type, std::true_type >);
47a29a1a33SNikolas Klauser static_assert(!std::disjunction_v<std::false_type, std::false_type>);
48a29a1a33SNikolas Klauser 
49a29a1a33SNikolas Klauser static_assert( std::disjunction<std::true_type,  std::true_type,  std::true_type >::value);
50a29a1a33SNikolas Klauser static_assert( std::disjunction<std::true_type,  std::false_type, std::true_type >::value);
51a29a1a33SNikolas Klauser static_assert( std::disjunction<std::false_type, std::true_type,  std::true_type >::value);
52a29a1a33SNikolas Klauser static_assert( std::disjunction<std::false_type, std::false_type, std::true_type >::value);
53a29a1a33SNikolas Klauser static_assert( std::disjunction<std::true_type,  std::true_type,  std::false_type>::value);
54a29a1a33SNikolas Klauser static_assert( std::disjunction<std::true_type,  std::false_type, std::false_type>::value);
55a29a1a33SNikolas Klauser static_assert( std::disjunction<std::false_type, std::true_type,  std::false_type>::value);
56a29a1a33SNikolas Klauser static_assert(!std::disjunction<std::false_type, std::false_type, std::false_type>::value);
57a29a1a33SNikolas Klauser 
58a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::true_type,  std::true_type,  std::true_type >);
59a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::true_type,  std::false_type, std::true_type >);
60a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::false_type, std::true_type,  std::true_type >);
61a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::false_type, std::false_type, std::true_type >);
62a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::true_type,  std::true_type,  std::false_type>);
63a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::true_type,  std::false_type, std::false_type>);
64a29a1a33SNikolas Klauser static_assert( std::disjunction_v<std::false_type, std::true_type,  std::false_type>);
65a29a1a33SNikolas Klauser static_assert(!std::disjunction_v<std::false_type, std::false_type, std::false_type>);
66a29a1a33SNikolas Klauser 
67a29a1a33SNikolas Klauser static_assert ( std::disjunction<True >::value, "" );
68a29a1a33SNikolas Klauser static_assert (!std::disjunction<False>::value, "" );
69a29a1a33SNikolas Klauser 
70a29a1a33SNikolas Klauser static_assert ( std::disjunction_v<True >, "" );
71a29a1a33SNikolas Klauser static_assert (!std::disjunction_v<False>, "" );
72a29a1a33SNikolas Klauser 
73a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<MySpecialFalseType, std::disjunction<MyOtherSpecialFalseType, MySpecialFalseType>>);
74a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<MyOtherSpecialFalseType, std::disjunction<MySpecialFalseType, MyOtherSpecialFalseType>>);
75a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<MySpecialTrueType, std::disjunction<MySpecialTrueType, MyOtherSpecialFalseType>>);
76a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<MySpecialTrueType, std::disjunction<MyOtherSpecialFalseType, MySpecialTrueType>>);
77a29a1a33SNikolas Klauser 
78a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<std::true_type, std::disjunction<std::true_type, HasNoValue>>);
79a29a1a33SNikolas Klauser 
80a29a1a33SNikolas Klauser static_assert(std::disjunction<std::true_type, HasNoValue>::value);
81a29a1a33SNikolas Klauser static_assert(std::disjunction_v<std::true_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::disjunction<std::true_type, HasNoValue, std::true_type>::value);
85*a0549ee2SAaron Jacobs static_assert(std::disjunction_v<std::true_type, HasNoValue, std::true_type>);
86*a0549ee2SAaron Jacobs 
87*a0549ee2SAaron Jacobs static_assert(std::disjunction<std::true_type, HasNoValue, std::false_type>::value);
88*a0549ee2SAaron Jacobs static_assert(std::disjunction_v<std::true_type, HasNoValue, std::false_type>);
89*a0549ee2SAaron Jacobs 
90a29a1a33SNikolas Klauser static_assert(std::disjunction<MySpecialTrueType>::value == -1);
91a29a1a33SNikolas Klauser static_assert(std::disjunction_v<MySpecialTrueType>);
92a29a1a33SNikolas Klauser 
93a29a1a33SNikolas Klauser static_assert(std::is_base_of_v<ValueExplicitlyConvertible, std::disjunction<ValueExplicitlyConvertible>>);
94a29a1a33SNikolas Klauser static_assert(std::disjunction_v<ValueExplicitlyConvertible, std::true_type>);
95