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_nothrow_copy_assignable 12 13 #include <type_traits> 14 #include "test_macros.h" 15 16 template <class T> test_has_nothrow_assign()17void test_has_nothrow_assign() 18 { 19 static_assert( std::is_nothrow_copy_assignable<T>::value, ""); 20 #if TEST_STD_VER > 14 21 static_assert( std::is_nothrow_copy_assignable_v<T>, ""); 22 #endif 23 } 24 25 template <class T> test_has_not_nothrow_assign()26void test_has_not_nothrow_assign() 27 { 28 static_assert(!std::is_nothrow_copy_assignable<T>::value, ""); 29 #if TEST_STD_VER > 14 30 static_assert(!std::is_nothrow_copy_assignable_v<T>, ""); 31 #endif 32 } 33 34 class Empty 35 { 36 }; 37 38 struct NotEmpty 39 { 40 virtual ~NotEmpty(); 41 }; 42 43 union Union {}; 44 45 struct bit_zero 46 { 47 int : 0; 48 }; 49 50 struct A 51 { 52 A& operator=(const A&); 53 }; 54 main(int,char **)55int main(int, char**) 56 { 57 test_has_nothrow_assign<int&>(); 58 test_has_nothrow_assign<Union>(); 59 test_has_nothrow_assign<Empty>(); 60 test_has_nothrow_assign<int>(); 61 test_has_nothrow_assign<double>(); 62 test_has_nothrow_assign<int*>(); 63 test_has_nothrow_assign<const int*>(); 64 test_has_nothrow_assign<NotEmpty>(); 65 test_has_nothrow_assign<bit_zero>(); 66 67 test_has_not_nothrow_assign<const int>(); 68 test_has_not_nothrow_assign<void>(); 69 test_has_not_nothrow_assign<A>(); 70 71 72 return 0; 73 } 74