blob: 041fe9a7853d7862359b8678507466824154fdda [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// template<class Y> explicit shared_ptr(Y* p);
13
Eric Fiselier07a4bec2015-03-10 20:46:04 +000014// UNSUPPORTED: sanitizer-new-delete
Eric Fiselier72aab5f2014-11-04 05:11:41 +000015
Howard Hinnantc52f43e2010-08-22 00:59:46 +000016#include <memory>
17#include <new>
18#include <cstdlib>
19#include <cassert>
20
21struct A
22{
23 static int count;
24
25 A() {++count;}
26 A(const A&) {++count;}
27 ~A() {--count;}
28};
29
30int A::count = 0;
31
32bool throw_next = false;
33
34void* operator new(std::size_t s) throw(std::bad_alloc)
35{
36 if (throw_next)
37 throw std::bad_alloc();
38 return std::malloc(s);
39}
40
41void operator delete(void* p) throw()
42{
43 std::free(p);
44}
45
46int main()
47{
48 {
49 A* ptr = new A;
50 throw_next = true;
51 assert(A::count == 1);
52 try
53 {
54 std::shared_ptr<A> p(ptr);
55 assert(false);
56 }
57 catch (std::bad_alloc&)
58 {
59 assert(A::count == 0);
60 }
61 }
62}