// { dg-options "-std=gnu++23" } // { dg-do compile { target c++23 } } #include #ifndef __cpp_lib_constexpr_memory # error "Feature test macro for constexpr unique_ptr is missing in " #elif __cpp_lib_constexpr_memory < 202202L # error "Feature test macro for constexpr unique_ptr has wrong value in " #endif #include constexpr bool test_default() { std::unique_ptr p; std::unique_ptr np(nullptr); VERIFY( p == np ); std::unique_ptr a; std::unique_ptr na(nullptr); VERIFY( a == na ); return true; } static_assert( test_default() ); constexpr bool test_ptr() { std::unique_ptr p(new int(2)); VERIFY( *p == 2 ); std::unique_ptr a(new int[]{0, 1, 2}); VERIFY( a[2] == 2 ); return true; } static_assert( test_ptr() ); constexpr bool test_del() { const std::default_delete pd; std::unique_ptr p1(new int(1), pd); VERIFY( *p1 == 1 ); std::unique_ptr p2(new int(2), std::default_delete{}); VERIFY( *p2 == 2 ); const std::default_delete ad; std::unique_ptr a1(new int[]{3, 4}, ad); VERIFY( a1[0] == 3 ); std::unique_ptr a2(new int[]{5, 6}, std::default_delete{}); VERIFY( a2[1] == 6 ); return true; } static_assert( test_del() ); constexpr bool test_move() { std::unique_ptr p1(new int(2)); std::unique_ptr p2 = std::move(p1); VERIFY( *p2 == 2 ); std::unique_ptr a1(new int[]{0, 1, 2}); std::unique_ptr a2 = std::move(a1); VERIFY( a2[2] == 2 ); return true; } static_assert( test_move() ); constexpr bool test_convert() { std::unique_ptr p1(new int(2)); std::unique_ptr p2 = std::move(p1); VERIFY( *p2 == 2 ); std::unique_ptr a1(new int[]{0, 1, 2}); std::unique_ptr a2 = std::move(a1); VERIFY( a2[2] == 2 ); return true; } static_assert( test_convert() );