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 25struct A 26{ 27 A(int i, double d, char c = '\0') : i(i), d(d), c(c) { ++ctor_count; } 28 explicit A(int i) : i(i), d(), c() { ++ctor_count; } 29 A() : i(), d(), c() { ++ctor_count; } 30 ~A() { ++dtor_count; } 31 int i; 32 double d; 33 char c; 34 static int ctor_count; 35 static int dtor_count; 36}; 37int A::ctor_count = 0; 38int A::dtor_count = 0; 39 40struct reset_count_struct 41{ 42 ~reset_count_struct() 43 { 44 A::ctor_count = 0; 45 A::dtor_count = 0; 46 } 47}; 48 49// 20.6.6.2.6 shared_ptr creation [util.smartptr.shared.create] 50 51void 52test01() 53{ 54 bool test __attribute__((unused)) = true; 55 reset_count_struct __attribute__((unused)) reset; 56 57 { 58 std::shared_ptr<A> p1 = std::make_shared<A>(); 59 VERIFY( p1.get() != 0 ); 60 VERIFY( p1.use_count() == 1 ); 61 VERIFY( A::ctor_count == 1 ); 62 } 63 VERIFY( A::ctor_count == A::dtor_count ); 64} 65 66void 67test02() 68{ 69 bool test __attribute__((unused)) = true; 70 reset_count_struct __attribute__((unused)) reset; 71 72 std::shared_ptr<A> p1; 73 74 p1 = std::make_shared<A>(1); 75 VERIFY( A::ctor_count == 1 ); 76 77 p1 = std::make_shared<A>(1, 2.0); 78 VERIFY( A::ctor_count == 2 ); 79 VERIFY( A::dtor_count == 1 ); 80 81 p1 = std::make_shared<A>(1, 2.0, '3'); 82 VERIFY( A::ctor_count == 3 ); 83 VERIFY( A::dtor_count == 2 ); 84 VERIFY( p1->i == 1 ); 85 VERIFY( p1->d == 2.0 ); 86 VERIFY( p1->c == '3' ); 87 88 p1 = std::shared_ptr<A>(); 89 VERIFY( A::ctor_count == A::dtor_count ); 90} 91 92int 93main() 94{ 95 test01(); 96 test02(); 97} 98