1afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow//===----------------------------------------------------------------------===//
2afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow//
3afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow//                     The LLVM Compiler Infrastructure
4afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow//
5afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow// This file is dual licensed under the MIT and the University of Illinois Open
6afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow// Source Licenses. See LICENSE.TXT for details.
7afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow//
8afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow//===----------------------------------------------------------------------===//
9afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
10afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow// UNSUPPORTED: c++98, c++03, c++11
11afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow// <experimental/type_traits>
12afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
13afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow// template<class... B> struct disjunction;
14afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow// template<class... B>
15afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow//   constexpr bool disjunction_v = disjunction<B...>::value;
16afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
17afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow#include <experimental/type_traits>
18afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow#include <cassert>
19afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
20afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clownamespace ex = std::experimental;
21afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
22afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clowstruct True  { static constexpr bool value = true; };
23afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clowstruct False { static constexpr bool value = false; };
24afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
25afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clowint main()
26afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow{
27afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction<>::value, "" );
28afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::true_type >::value, "" );
29afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction<std::false_type>::value, "" );
30afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
31afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction_v<>, "" );
32afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::true_type >, "" );
33afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction_v<std::false_type>, "" );
34afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
35afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::true_type,  std::true_type >::value, "" );
36afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::true_type,  std::false_type>::value, "" );
37afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::false_type, std::true_type >::value, "" );
38afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction<std::false_type, std::false_type>::value, "" );
39afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
40afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::true_type,  std::true_type >, "" );
41afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::true_type,  std::false_type>, "" );
42afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::false_type, std::true_type >, "" );
43afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction_v<std::false_type, std::false_type>, "" );
44afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
45afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::true_type,  std::true_type,  std::true_type >::value, "" );
46afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::true_type,  std::false_type, std::true_type >::value, "" );
47afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::false_type, std::true_type,  std::true_type >::value, "" );
48afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::false_type, std::false_type, std::true_type >::value, "" );
49afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::true_type,  std::true_type,  std::false_type>::value, "" );
50afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::true_type,  std::false_type, std::false_type>::value, "" );
51afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<std::false_type, std::true_type,  std::false_type>::value, "" );
52afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction<std::false_type, std::false_type, std::false_type>::value, "" );
53afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
54afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::true_type,  std::true_type,  std::true_type >, "" );
55afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::true_type,  std::false_type, std::true_type >, "" );
56afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::false_type, std::true_type,  std::true_type >, "" );
57afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::false_type, std::false_type, std::true_type >, "" );
58afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::true_type,  std::true_type,  std::false_type>, "" );
59afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::true_type,  std::false_type, std::false_type>, "" );
60afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<std::false_type, std::true_type,  std::false_type>, "" );
61afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction_v<std::false_type, std::false_type, std::false_type>, "" );
62afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
63afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction<True >::value, "" );
64afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction<False>::value, "" );
65afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow
66afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert ( ex::disjunction_v<True >, "" );
67afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow    static_assert (!ex::disjunction_v<False>, "" );
68afa9b590b2bed07e26e79dc4dd22b9942c8ec85cMarshall Clow}
69