1// { dg-options "-std=gnu++0x" } 2 3// Copyright (C) 2007, 2008, 2009 Free Software Foundation 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING3. If not see 18// <http://www.gnu.org/licenses/>. 19 20// 20.6.6.2 Template class shared_ptr [util.smartptr.shared] 21 22#include <memory> 23#include <testsuite_hooks.h> 24#include <testsuite_allocator.h> 25 26using __gnu_test::tracker_allocator_counter; 27using __gnu_test::tracker_allocator; 28 29struct A 30{ 31 A(int i, double d, char c = '\0') : i(i), d(d), c(c) { ++ctor_count; } 32 explicit A(int i) : i(i), d(), c() { ++ctor_count; } 33 A() : i(), d(), c() { ++ctor_count; } 34 ~A() { ++dtor_count; } 35 int i; 36 double d; 37 char c; 38 static int ctor_count; 39 static int dtor_count; 40}; 41int A::ctor_count = 0; 42int A::dtor_count = 0; 43 44struct reset_count_struct 45{ 46 ~reset_count_struct() 47 { 48 A::ctor_count = 0; 49 A::dtor_count = 0; 50 tracker_allocator_counter::reset(); 51 } 52}; 53 54// 20.6.6.2.6 shared_ptr creation [util.smartptr.shared.create] 55 56void 57test01() 58{ 59 bool test __attribute__((unused)) = true; 60 reset_count_struct __attribute__((unused)) reset; 61 62 { 63 std::shared_ptr<A> p1 = std::allocate_shared<A>(tracker_allocator<A>()); 64 VERIFY( p1.get() != 0 ); 65 VERIFY( p1.use_count() == 1 ); 66 VERIFY( A::ctor_count == 1 ); 67 VERIFY( tracker_allocator_counter::get_allocation_count() > 0 ); 68 } 69 VERIFY( A::ctor_count == A::dtor_count ); 70 VERIFY( tracker_allocator_counter::get_allocation_count() 71 == tracker_allocator_counter::get_deallocation_count() ); 72} 73 74void 75test02() 76{ 77 bool test __attribute__((unused)) = true; 78 reset_count_struct __attribute__((unused)) reset; 79 80 std::shared_ptr<A> p1; 81 82 p1 = std::allocate_shared<A>(tracker_allocator<A>(), 1); 83 VERIFY( A::ctor_count == 1 ); 84 VERIFY( tracker_allocator_counter::get_allocation_count() > 0 ); 85 86 p1 = std::allocate_shared<A>(tracker_allocator<A>(), 1, 2.0); 87 VERIFY( A::ctor_count == 2 ); 88 VERIFY( A::dtor_count == 1 ); 89 VERIFY( tracker_allocator_counter::get_deallocation_count() > 0 ); 90 91 p1 = std::allocate_shared<A>(tracker_allocator<A>(), 1, 2.0, '3'); 92 VERIFY( A::ctor_count == 3 ); 93 VERIFY( A::dtor_count == 2 ); 94 VERIFY( p1->i == 1 ); 95 VERIFY( p1->d == 2.0 ); 96 VERIFY( p1->c == '3' ); 97 98 p1 = std::shared_ptr<A>(); 99 VERIFY( A::ctor_count == A::dtor_count ); 100 VERIFY( tracker_allocator_counter::get_allocation_count() 101 == tracker_allocator_counter::get_deallocation_count() ); 102} 103 104int 105main() 106{ 107 test01(); 108 test02(); 109 return 0; 110} 111