Files
clang-p2996/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.modifiers/release.pass.cpp
Eric Fiselier 4727272254 Overhaul unique_ptr - Implement LWG 2801, 2905, 2520.
This patch overhauls both specializations of unique_ptr while implementing
the following LWG issues:

* LWG 2801 - This issue constrains unique_ptr's constructors when the deleter type
  is not default constructible. Additionally it adds SFINAE conditions
  to unique_ptr<T[]>::unique_ptr(Up).

* LWG 2905 - This issue reworks the unique_ptr(pointer, /* see below */ deleter)
  constructors so that they correctly SFINAE when the deleter argument cannot
  be used to construct the stored deleter.

* LWG 2520 - This issue fixes initializing unique_ptr<T[]> from nullptr.
  Libc++ had previously implemented this issue, but the suggested resolution
  still broke initialization from NULL. This patch re-works the
  unique_ptr<T[]>(Up, deleter) overloads so that they accept NULL as well
  as nullptr.

llvm-svn: 300406
2017-04-16 01:51:04 +00:00

57 lines
1.2 KiB
C++

//===----------------------------------------------------------------------===//
//
// 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.
//
//===----------------------------------------------------------------------===//
// <memory>
// unique_ptr
// test release
#include <memory>
#include <cassert>
#include "test_macros.h"
#include "unique_ptr_test_helper.h"
template <bool IsArray>
void test_basic() {
typedef typename std::conditional<IsArray, A[], A>::type VT;
const int expect_alive = IsArray ? 3 : 1;
#if TEST_STD_VER >= 11
{
using U = std::unique_ptr<VT>;
U u; ((void)u);
ASSERT_NOEXCEPT(u.release());
}
#endif
{
std::unique_ptr<VT> p(newValue<VT>(expect_alive));
assert(A::count == expect_alive);
A* ap = p.get();
A* a = p.release();
assert(A::count == expect_alive);
assert(p.get() == nullptr);
assert(ap == a);
assert(a != nullptr);
if (IsArray)
delete[] a;
else
delete a;
assert(A::count == 0);
}
assert(A::count == 0);
}
int main() {
test_basic</*IsArray*/ false>();
test_basic<true>();
}