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