1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // type_traits 10 11 // is_copy_constructible 12 13 #include <type_traits> 14 #include "test_macros.h" 15 16 template <class T> test_is_copy_constructible()17void test_is_copy_constructible() 18 { 19 static_assert( std::is_copy_constructible<T>::value, ""); 20 #if TEST_STD_VER > 14 21 static_assert( std::is_copy_constructible_v<T>, ""); 22 #endif 23 } 24 25 template <class T> test_is_not_copy_constructible()26void test_is_not_copy_constructible() 27 { 28 static_assert(!std::is_copy_constructible<T>::value, ""); 29 #if TEST_STD_VER > 14 30 static_assert(!std::is_copy_constructible_v<T>, ""); 31 #endif 32 } 33 34 class Empty 35 { 36 }; 37 38 class NotEmpty 39 { 40 public: 41 virtual ~NotEmpty(); 42 }; 43 44 union Union {}; 45 46 struct bit_zero 47 { 48 int : 0; 49 }; 50 51 class Abstract 52 { 53 public: 54 virtual ~Abstract() = 0; 55 }; 56 57 struct A 58 { 59 A(const A&); 60 }; 61 62 class B 63 { 64 B(const B&); 65 }; 66 67 struct C 68 { 69 C(C&); // not const 70 void operator=(C&); // not const 71 }; 72 main(int,char **)73int main(int, char**) 74 { 75 test_is_copy_constructible<A>(); 76 test_is_copy_constructible<int&>(); 77 test_is_copy_constructible<Union>(); 78 test_is_copy_constructible<Empty>(); 79 test_is_copy_constructible<int>(); 80 test_is_copy_constructible<double>(); 81 test_is_copy_constructible<int*>(); 82 test_is_copy_constructible<const int*>(); 83 test_is_copy_constructible<NotEmpty>(); 84 test_is_copy_constructible<bit_zero>(); 85 86 test_is_not_copy_constructible<char[3]>(); 87 test_is_not_copy_constructible<char[]>(); 88 test_is_not_copy_constructible<void>(); 89 test_is_not_copy_constructible<Abstract>(); 90 test_is_not_copy_constructible<C>(); 91 #if TEST_STD_VER >= 11 92 test_is_not_copy_constructible<B>(); 93 #endif 94 95 return 0; 96 } 97