blob: fe0b5673bc44d743e22ae2157acb1924658d6955 [file] [log] [blame]
Howard Hinnantc52f43e2010-08-22 00:59:46 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc52f43e2010-08-22 00:59:46 +00007//
8//===----------------------------------------------------------------------===//
9
10// type_traits
11
12// template <class T, class... Args>
13// struct is_nothrow_constructible;
14
15#include <type_traits>
16
Marshall Clow933afa92013-07-04 00:10:01 +000017template <class T>
18void test_is_nothrow_constructible()
19{
20 static_assert(( std::is_nothrow_constructible<T>::value), "");
21}
22
23template <class T, class A0>
24void test_is_nothrow_constructible()
25{
26 static_assert(( std::is_nothrow_constructible<T, A0>::value), "");
27}
28
29template <class T>
30void test_is_not_nothrow_constructible()
31{
32 static_assert((!std::is_nothrow_constructible<T>::value), "");
33}
34
35template <class T, class A0>
36void test_is_not_nothrow_constructible()
37{
38 static_assert((!std::is_nothrow_constructible<T, A0>::value), "");
39}
40
41template <class T, class A0, class A1>
42void test_is_not_nothrow_constructible()
43{
44 static_assert((!std::is_nothrow_constructible<T, A0, A1>::value), "");
45}
46
Howard Hinnantc52f43e2010-08-22 00:59:46 +000047class Empty
48{
49};
50
51class NotEmpty
52{
53 virtual ~NotEmpty();
54};
55
56union Union {};
57
58struct bit_zero
59{
60 int : 0;
61};
62
63class Abstract
64{
65 virtual ~Abstract() = 0;
66};
67
68struct A
69{
70 A(const A&);
71};
72
Marshall Clowd132bf42014-09-22 23:58:00 +000073struct C
74{
75 C(C&); // not const
76 void operator=(C&); // not const
77};
78
Marshall Clowdf9722e2014-10-07 21:42:12 +000079#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
80struct Tuple {
81 Tuple(Empty&&) noexcept {}
82};
83#endif
84
Howard Hinnantc52f43e2010-08-22 00:59:46 +000085int main()
86{
Marshall Clow933afa92013-07-04 00:10:01 +000087 test_is_nothrow_constructible<int> ();
88 test_is_nothrow_constructible<int, const int&> ();
89 test_is_nothrow_constructible<Empty> ();
90 test_is_nothrow_constructible<Empty, const Empty&> ();
Marshall Clowdf9722e2014-10-07 21:42:12 +000091#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
92 test_is_nothrow_constructible<Tuple &&, Empty> (); // See bug #19616.
93#endif
94
Marshall Clow933afa92013-07-04 00:10:01 +000095 test_is_not_nothrow_constructible<A, int> ();
96 test_is_not_nothrow_constructible<A, int, double> ();
97 test_is_not_nothrow_constructible<A> ();
Marshall Clowd132bf42014-09-22 23:58:00 +000098 test_is_not_nothrow_constructible<C> ();
Marshall Clowdf9722e2014-10-07 21:42:12 +000099#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
100 static_assert(!std::is_constructible<Tuple&, Empty>::value, "");
101 test_is_not_nothrow_constructible<Tuple &, Empty> (); // See bug #19616.
102#endif
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000103}