111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// XFAIL: libcpp-no-exceptions 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <memory> 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// shared_ptr 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <memory> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct B 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static int count; 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert B() {++count;} 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert B(const B&) {++count;} 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual ~B() {--count;} 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint B::count = 0; 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct A 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : public B 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static int count; 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert A() {++count;} 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert A(const A&) {++count;} 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~A() {--count;} 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint A::count = 0; 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::weak_ptr<A> wp; 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert try 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::shared_ptr<A> sp(wp); 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(false); 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert catch (std::bad_weak_ptr&) 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::shared_ptr<A> sp0(new A); 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::weak_ptr<A> wp(sp0); 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::shared_ptr<A> sp(wp); 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sp.use_count() == 2); 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sp.get() == sp0.get()); 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 1); 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::shared_ptr<A> sp0(new A); 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::weak_ptr<A> wp(sp0); 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sp0.reset(); 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert try 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::shared_ptr<A> sp(wp); 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(false); 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert catch (std::bad_weak_ptr&) 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 81