blob: f878a50c3af5cce440a715926ebd06d14532dcb5 [file] [log] [blame]
Howard Hinnant1468b662010-11-19 22:17:28 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// type_traits
11
12// is_copy_constructible
13
14#include <type_traits>
15
Marshall Clow933afa92013-07-04 00:10:01 +000016template <class T>
Howard Hinnant1468b662010-11-19 22:17:28 +000017void test_is_copy_constructible()
18{
Marshall Clow933afa92013-07-04 00:10:01 +000019 static_assert( std::is_copy_constructible<T>::value, "");
20}
21
22template <class T>
23void test_is_not_copy_constructible()
24{
25 static_assert(!std::is_copy_constructible<T>::value, "");
Howard Hinnant1468b662010-11-19 22:17:28 +000026}
27
28class Empty
29{
30};
31
32class NotEmpty
33{
34public:
35 virtual ~NotEmpty();
36};
37
38union Union {};
39
40struct bit_zero
41{
42 int : 0;
43};
44
45class Abstract
46{
47public:
48 virtual ~Abstract() = 0;
49};
50
51struct A
52{
53 A(const A&);
54};
55
Howard Hinnant6063ec12011-05-13 14:08:16 +000056class B
57{
58 B(const B&);
59};
60
Marshall Clowd132bf42014-09-22 23:58:00 +000061struct C
62{
63 C(C&); // not const
64 void operator=(C&); // not const
65};
66
Howard Hinnant1468b662010-11-19 22:17:28 +000067int main()
68{
Marshall Clow933afa92013-07-04 00:10:01 +000069 test_is_copy_constructible<A>();
70 test_is_copy_constructible<int&>();
71 test_is_copy_constructible<Union>();
72 test_is_copy_constructible<Empty>();
73 test_is_copy_constructible<int>();
74 test_is_copy_constructible<double>();
75 test_is_copy_constructible<int*>();
76 test_is_copy_constructible<const int*>();
77 test_is_copy_constructible<NotEmpty>();
78 test_is_copy_constructible<bit_zero>();
Howard Hinnant1468b662010-11-19 22:17:28 +000079
Marshall Clow933afa92013-07-04 00:10:01 +000080 test_is_not_copy_constructible<char[3]>();
81 test_is_not_copy_constructible<char[]>();
82 test_is_not_copy_constructible<void>();
83 test_is_not_copy_constructible<Abstract>();
Marshall Clowd132bf42014-09-22 23:58:00 +000084 test_is_not_copy_constructible<C>();
Marshall Clow933afa92013-07-04 00:10:01 +000085#if __has_feature(cxx_access_control_sfinae)
86 test_is_not_copy_constructible<B>();
87#endif
Howard Hinnant1468b662010-11-19 22:17:28 +000088}