blob: 97d3f69fb5c4be748ad4506761856086f90e7fd0 [file] [log] [blame]
Howard Hinnantc52f43e2010-08-22 00:59:46 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc52f43e2010-08-22 00:59:46 +00007//
8//===----------------------------------------------------------------------===//
9
10// <memory>
11
12// shared_ptr
13
14// template<class D> shared_ptr(nullptr_t, D d);
15
Eric Fiselier07a4bec2015-03-10 20:46:04 +000016// UNSUPPORTED: sanitizer-new-delete
Eric Fiselier72aab5f2014-11-04 05:11:41 +000017
Howard Hinnantc52f43e2010-08-22 00:59:46 +000018#include <memory>
19#include <cassert>
20#include <new>
21#include <cstdlib>
22#include "../test_deleter.h"
23
24struct A
25{
26 static int count;
27
28 A() {++count;}
29 A(const A&) {++count;}
30 ~A() {--count;}
31};
32
33int A::count = 0;
34
35bool throw_next = false;
36
37void* operator new(std::size_t s) throw(std::bad_alloc)
38{
39 if (throw_next)
40 throw std::bad_alloc();
41 return std::malloc(s);
42}
43
44void operator delete(void* p) throw()
45{
46 std::free(p);
47}
48
49int main()
50{
51 throw_next = true;
52 try
53 {
54 std::shared_ptr<A> p(nullptr, test_deleter<A>(3));
55 assert(false);
56 }
57 catch (std::bad_alloc&)
58 {
59 assert(A::count == 0);
60 assert(test_deleter<A>::count == 0);
61 assert(test_deleter<A>::dealloc_count == 1);
62 }
63}