1 // Copyright (C) 2000-2016 Free Software Foundation, Inc. 2 // 3 // This file is part of the GNU ISO C++ Library. This library is free 4 // software; you can redistribute it and/or modify it under the 5 // terms of the GNU General Public License as published by the 6 // Free Software Foundation; either version 3, or (at your option) 7 // any later version. 8 9 // This library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 14 // You should have received a copy of the GNU General Public License along 15 // with this library; see the file COPYING3. If not see 16 // <http://www.gnu.org/licenses/>. 17 18 // 20.4.5 Template class auto_ptr [lib.auto.ptr] 19 20 // { dg-options "-std=c++98" } 21 22 #include <memory> 23 #include <testsuite_hooks.h> 24 25 struct A 26 { AA27 A() { ++ctor_count; } ~AA28 virtual ~A() { ++dtor_count; } 29 static long ctor_count; 30 static long dtor_count; 31 }; 32 long A::ctor_count = 0; 33 long A::dtor_count = 0; 34 35 struct B : A 36 { BB37 B() { ++ctor_count; } ~BB38 virtual ~B() { ++dtor_count; } 39 static long ctor_count; 40 static long dtor_count; 41 }; 42 long B::ctor_count = 0; 43 long B::dtor_count = 0; 44 45 46 struct reset_count_struct 47 { ~reset_count_structreset_count_struct48 ~reset_count_struct() 49 { 50 A::ctor_count = 0; 51 A::dtor_count = 0; 52 B::ctor_count = 0; 53 B::dtor_count = 0; 54 } 55 }; 56 57 // 20.4.5.2 auto_ptr members [lib.auto.ptr.members] 58 59 // Member access 60 int test06()61test06() 62 { 63 reset_count_struct __attribute__((unused)) reset; 64 bool test __attribute__((unused)) = true; 65 66 std::auto_ptr<A> A_from_A(new A); 67 std::auto_ptr<A> A_from_A_ptr(A_from_A.release()); 68 VERIFY( A_from_A.get() == 0 ); 69 VERIFY( A_from_A_ptr.get() != 0 ); 70 VERIFY( A_from_A_ptr->ctor_count == 1 ); 71 VERIFY( (*A_from_A_ptr).dtor_count == 0 ); 72 73 A* A_ptr = A_from_A_ptr.get(); 74 75 A_from_A_ptr.reset(A_ptr); 76 VERIFY( A_from_A_ptr.get() == A_ptr ); 77 VERIFY( A_from_A_ptr->ctor_count == 1 ); 78 VERIFY( (*A_from_A_ptr).dtor_count == 0 ); 79 80 A_from_A_ptr.reset(new A); 81 VERIFY( A_from_A_ptr.get() != A_ptr ); 82 VERIFY( A_from_A_ptr->ctor_count == 2 ); 83 VERIFY( (*A_from_A_ptr).dtor_count == 1 ); 84 return 0; 85 } 86 87 int main()88main() 89 { 90 test06(); 91 return 0; 92 } 93