12561885fSEric Fiselier //===----------------------------------------------------------------------===//
22561885fSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62561885fSEric Fiselier //
72561885fSEric Fiselier //===----------------------------------------------------------------------===//
82561885fSEric Fiselier 
92561885fSEric Fiselier // <memory>
102561885fSEric Fiselier 
112561885fSEric Fiselier // unique_ptr
122561885fSEric Fiselier 
132561885fSEric Fiselier // unique_ptr(nullptr_t);
142561885fSEric Fiselier 
152561885fSEric Fiselier #include <memory>
162561885fSEric Fiselier #include <cassert>
172561885fSEric Fiselier 
182561885fSEric Fiselier #include "test_macros.h"
192561885fSEric Fiselier #include "unique_ptr_test_helper.h"
202561885fSEric Fiselier 
212561885fSEric Fiselier 
222561885fSEric Fiselier #if TEST_STD_VER >= 11
23*05337a75SArthur O'Dwyer TEST_CONSTINIT std::unique_ptr<int> global_static_unique_ptr_single(nullptr);
24*05337a75SArthur O'Dwyer TEST_CONSTINIT std::unique_ptr<int[]> global_static_unique_ptr_runtime(nullptr);
255dc1da3eSMark de Wever 
262561885fSEric Fiselier struct NonDefaultDeleter {
272561885fSEric Fiselier   NonDefaultDeleter() = delete;
operator ()NonDefaultDeleter282561885fSEric Fiselier   void operator()(void*) const {}
292561885fSEric Fiselier };
302561885fSEric Fiselier #endif
312561885fSEric Fiselier 
322561885fSEric Fiselier template <class VT>
test_basic()332561885fSEric Fiselier void test_basic() {
342561885fSEric Fiselier #if TEST_STD_VER >= 11
352561885fSEric Fiselier   {
362561885fSEric Fiselier     using U1 = std::unique_ptr<VT>;
372561885fSEric Fiselier     using U2 = std::unique_ptr<VT, Deleter<VT> >;
382561885fSEric Fiselier     static_assert(std::is_nothrow_constructible<U1, decltype(nullptr)>::value,
392561885fSEric Fiselier                   "");
402561885fSEric Fiselier     static_assert(std::is_nothrow_constructible<U2, decltype(nullptr)>::value,
412561885fSEric Fiselier                   "");
422561885fSEric Fiselier   }
432561885fSEric Fiselier #endif
4447272722SEric Fiselier   {
4547272722SEric Fiselier     std::unique_ptr<VT> p(nullptr);
4647272722SEric Fiselier     assert(p.get() == 0);
4747272722SEric Fiselier   }
4847272722SEric Fiselier   {
4947272722SEric Fiselier     std::unique_ptr<VT, NCDeleter<VT> > p(nullptr);
5047272722SEric Fiselier     assert(p.get() == 0);
5147272722SEric Fiselier     assert(p.get_deleter().state() == 0);
5247272722SEric Fiselier   }
5368e2231fSJohan Berg   {
5468e2231fSJohan Berg     std::unique_ptr<VT, DefaultCtorDeleter<VT> > p(nullptr);
5568e2231fSJohan Berg     assert(p.get() == 0);
5668e2231fSJohan Berg     assert(p.get_deleter().state() == 0);
5768e2231fSJohan Berg   }
582561885fSEric Fiselier }
592561885fSEric Fiselier 
602561885fSEric Fiselier template <class VT>
test_sfinae()612561885fSEric Fiselier void test_sfinae() {
6247272722SEric Fiselier #if TEST_STD_VER >= 11
63437e0e51SStephan T. Lavavej   { // the constructor does not participate in overload resolution when
642561885fSEric Fiselier     // the deleter is a pointer type
652561885fSEric Fiselier     using U = std::unique_ptr<VT, void (*)(void*)>;
662561885fSEric Fiselier     static_assert(!std::is_constructible<U, decltype(nullptr)>::value, "");
672561885fSEric Fiselier   }
682561885fSEric Fiselier   { // the constructor does not participate in overload resolution when
692561885fSEric Fiselier     // the deleter is not default constructible
702561885fSEric Fiselier     using Del = CDeleter<VT>;
712561885fSEric Fiselier     using U1 = std::unique_ptr<VT, NonDefaultDeleter>;
722561885fSEric Fiselier     using U2 = std::unique_ptr<VT, Del&>;
732561885fSEric Fiselier     using U3 = std::unique_ptr<VT, Del const&>;
742561885fSEric Fiselier     static_assert(!std::is_constructible<U1, decltype(nullptr)>::value, "");
752561885fSEric Fiselier     static_assert(!std::is_constructible<U2, decltype(nullptr)>::value, "");
762561885fSEric Fiselier     static_assert(!std::is_constructible<U3, decltype(nullptr)>::value, "");
772561885fSEric Fiselier   }
782561885fSEric Fiselier #endif
792561885fSEric Fiselier }
802561885fSEric Fiselier 
812561885fSEric Fiselier DEFINE_AND_RUN_IS_INCOMPLETE_TEST({
822561885fSEric Fiselier   { doIncompleteTypeTest(0, nullptr); }
832561885fSEric Fiselier   checkNumIncompleteTypeAlive(0);
842561885fSEric Fiselier   {
852561885fSEric Fiselier     doIncompleteTypeTest<IncompleteType, NCDeleter<IncompleteType> >(0,
862561885fSEric Fiselier                                                                      nullptr);
872561885fSEric Fiselier   }
882561885fSEric Fiselier   checkNumIncompleteTypeAlive(0);
892561885fSEric Fiselier   { doIncompleteTypeTest<IncompleteType[]>(0, nullptr); }
902561885fSEric Fiselier   checkNumIncompleteTypeAlive(0);
912561885fSEric Fiselier   {
922561885fSEric Fiselier     doIncompleteTypeTest<IncompleteType[], NCDeleter<IncompleteType[]> >(
932561885fSEric Fiselier         0, nullptr);
942561885fSEric Fiselier   }
952561885fSEric Fiselier   checkNumIncompleteTypeAlive(0);
962561885fSEric Fiselier })
972561885fSEric Fiselier 
main(int,char **)982df59c50SJF Bastien int main(int, char**) {
992561885fSEric Fiselier   {
1002561885fSEric Fiselier     test_basic<int>();
1012561885fSEric Fiselier     test_sfinae<int>();
1022561885fSEric Fiselier   }
1032561885fSEric Fiselier   {
1042561885fSEric Fiselier     test_basic<int[]>();
1052561885fSEric Fiselier     test_sfinae<int[]>();
1062561885fSEric Fiselier   }
1072df59c50SJF Bastien 
1082df59c50SJF Bastien   return 0;
1092561885fSEric Fiselier }
110