//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // unique_ptr // unique_ptr(nullptr_t); #include #include #include "test_macros.h" #include "unique_ptr_test_helper.h" #if defined(_LIBCPP_VERSION) && TEST_STD_VER >= 11 _LIBCPP_SAFE_STATIC std::unique_ptr global_static_unique_ptr_single(nullptr); _LIBCPP_SAFE_STATIC std::unique_ptr global_static_unique_ptr_runtime(nullptr); #endif #if TEST_STD_VER >= 11 struct NonDefaultDeleter { NonDefaultDeleter() = delete; void operator()(void*) const {} }; #endif template void test_basic() { #if TEST_STD_VER >= 11 { using U1 = std::unique_ptr; using U2 = std::unique_ptr >; static_assert(std::is_nothrow_constructible::value, ""); static_assert(std::is_nothrow_constructible::value, ""); } #endif { std::unique_ptr p(nullptr); assert(p.get() == 0); } { std::unique_ptr > p(nullptr); assert(p.get() == 0); assert(p.get_deleter().state() == 0); } } template void test_sfinae() { #if TEST_STD_VER >= 11 { // the constructor does not participate in overload resultion when // the deleter is a pointer type using U = std::unique_ptr; static_assert(!std::is_constructible::value, ""); } { // the constructor does not participate in overload resolution when // the deleter is not default constructible using Del = CDeleter; using U1 = std::unique_ptr; using U2 = std::unique_ptr; using U3 = std::unique_ptr; static_assert(!std::is_constructible::value, ""); static_assert(!std::is_constructible::value, ""); static_assert(!std::is_constructible::value, ""); } #endif } DEFINE_AND_RUN_IS_INCOMPLETE_TEST({ { doIncompleteTypeTest(0, nullptr); } checkNumIncompleteTypeAlive(0); { doIncompleteTypeTest >(0, nullptr); } checkNumIncompleteTypeAlive(0); { doIncompleteTypeTest(0, nullptr); } checkNumIncompleteTypeAlive(0); { doIncompleteTypeTest >( 0, nullptr); } checkNumIncompleteTypeAlive(0); }) int main() { { test_basic(); test_sfinae(); } { test_basic(); test_sfinae(); } }