blob: ead081645671b9fcb5fd0df0b7bf6b482ee4c62b [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 Y, class D> shared_ptr(Y* p, 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 A* ptr = new A;
52 throw_next = true;
53 try
54 {
55 std::shared_ptr<A> p(ptr, test_deleter<A>(3));
56 assert(false);
57 }
58 catch (std::bad_alloc&)
59 {
60 assert(A::count == 0);
61 assert(test_deleter<A>::count == 0);
62 assert(test_deleter<A>::dealloc_count == 1);
63 }
64}